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

下面的测试课,通过。

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: Any>有什么不同?

UPDATED随着答案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? 。 当返回类型为T:Any被调用时,由Mockito返回的null值将失败由Kotlin编译器插入的运行时检查。 在调用settingDependentObject之前抛出错误。

在类型参数上添加T : Any约束时,实际上使其非空: TAny子类型, Any不能包含空值。

由于该函数是内联的并且具有一个特定的类型参数,所以该参数被替换为一个真正的非空类型。 因此,在呼叫站点执行空检查,所以你得到这个例外。