Kotlin中的有什么不同?

下面的测试课,通过。

class SimpleClassTest { private inline fun  anyObject(): T { return Mockito.anyObject() } 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  anyObject(): T { return Mockito.anyObject() } 

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

它会失败

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

Kotlin中的有什么不同?

UPDATED随着答案Any是非空的,那么使用不应该返回错误,因为settingDependentObject(...)被声明接收一个非空参数。 我希望应该出错,但是与我所理解的相反。

我明白了什么错吗?

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

 inline fun  anyObject(): T = Mockito.anyObject() inline fun  anyObject(): T = Mockito.anyObject() 

Mockito.anyObject() 将为 T:AnyT:Any? 都返回null T:Any? 。 当返回types为T:Any被调用时,由Mockito返回的null值将失败由Kotlin编译器插入的运行时检查。 在调用settingDependentObject之前抛出错误。

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

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