首页 文章

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

提问于
浏览
6

通过下面的测试课程 .

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

<reified T> 与Kotlin的 <reified T: Any> 的不同之处是什么?

UPDATED 答案是Any为非null,然后使用 <reified T: Any> 不应返回错误,因为 settingDependentObject(...) 被声明为接收非null参数 . 我希望 <reified T> 应该出错,但它与我的理解相反 .

我明白了什么问题吗?

2 回答

  • 3

    当您在类型参数上添加 T : Any 约束时,您实际上将其设置为非空: TAny 的子类型, Any 不能保留空值 .

    由于函数是内联函数并且具有reified类型参数,因此该参数将替换为真正的非可空类型 . 因此,在呼叫站点上执行空检查,因此您将获得此异常 .

  • 7

    stated in the documentationthe linked answer,默认上限为 Any? . 换句话说,以下声明是等效的:

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

    Mockito.anyObject<T>() will return null适用于 T:AnyT:Any? . 当调用返回类型 T:Any 的方法时,Mockito返回的 null 值无法通过Kotlin编译器插入的运行时检查 . 在调用 settingDependentObject 之前,会抛出您获得的错误 .

相关问题