Class Kotlin 中参数化 类 的文字语法

Class literal syntax for parameterized classes in Kotlin

我正在尝试在 Kotlin 中模拟一个函数

Mockito.mock(Function2<Int, Int, Unit>::class.java)

它说 "Only classes are allowed on the left hand side of a class literal"。获取对静态已知参数化 class 的引用的正确方法是什么?现在我和一个丑陋的演员一起生活

Mockito.mock(Function2::class.java) as (Int, Int) -> Unit

错误正确,您提供的解决方案是预期的解决方案。这里的基本原理是因为泛型类型参数在运行时没有具体化,你只能获得一个代表 class 的对象,而不是 type.

虽然有一个解决方法:如果您通过具体化类型参数使用 class 文字语法,并在调用站点将其替换为所需的类型,您将获得相同的 KClass 对象但是根据您提供的实际参数。在您的情况下,您可以声明以下函数:

inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java) as T

并像这样使用它:

val f = mock<(Int, Int) -> Unit>()