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>()
我正在尝试在 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>()