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

Ely*_*lye 6 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())
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们改变了

    private inline fun <reified T> anyObject(): T {
        return Mockito.anyObject<T>()
    }
Run Code Online (Sandbox Code Playgroud)

    private inline fun <reified T: Any> anyObject(): T {
        return Mockito.anyObject<T>()
    }
Run Code Online (Sandbox Code Playgroud)

它将失败

java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null
Run Code Online (Sandbox Code Playgroud)

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

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

我明白了什么问题吗?

mie*_*sol 7

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

inline fun <reified T> anyObject(): T = Mockito.anyObject<T>()
inline fun <reified T:Any?> anyObject(): T = Mockito.anyObject<T>()
Run Code Online (Sandbox Code Playgroud)

Mockito.anyObject<T>() 会返回null两个T:AnyT:Any?.当T:Any调用具有返回类型的方法时null,Mockito返回的值无法通过Kotlin编译器插入的运行时检查.settingDependentObject调用之前抛出的错误.