在 Kotlin 中,<化 T> 与<化 T:任何>有什么不同?

  • 本文关键字:任何 Kotlin mockito kotlin
  • 更新时间 :
  • 英文 :


下面的测试类,通过。

class SimpleClassTest {
    private inline fun <reified T> anyObject(): T {
        return Mockito.anyObject<T>()
    }
    lateinit var simpleObject: SimpleClass
    @Mock lateinit var injectedObject: InjectedClass

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
    }
    @Test
    fun testSimpleFunction() {
        simpleObject = SimpleClass(injectedObject)
        simpleObject.simpleFunction()
        verify(injectedObject).settingDependentObject(anyObject())
    }
}

但是如果我们从

    private inline fun <reified T> anyObject(): T {
        return Mockito.anyObject<T>()
    }

    private inline fun <reified T: Any> anyObject(): T {
        return Mockito.anyObject<T>()
    }

它将失败

java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null

在 Kotlin 中<reified T> <reified T: Any>有什么不同?

更新如果答案是 Any 是非空的,那么使用 <reified T: Any> 不应该返回错误,因为settingDependentObject(...)被声明接收非空参数。我希望<reified T>应该出错,但这与我的理解相反。

我理解错了吗?

如文档和链接答案中所述,默认上限为 Any? 。换句话说,以下声明是等效的:

inline fun <reified T> anyObject(): T = Mockito.anyObject<T>()
inline fun <reified T:Any?> anyObject(): T = Mockito.anyObject<T>()

Mockito.anyObject<T>()将返回T:AnyT:Any?null。当调用返回类型为 T:Any 的方法时,Mockito 返回的 null 值无法通过 Kotlin 编译器插入的运行时检查。您收到的错误会在调用settingDependentObject之前引发。

当您在类型参数上添加T : Any约束时,您实际上是非 null:TAny 的子类型,Any不能保存 null。

由于该函数是内联的并且具有已确定的类型参数,因此该参数将替换为真正的不可为空的类型。因此,在呼叫站点上执行空检查,因此您会收到此异常。

相关内容

  • 没有找到相关文章

最新更新