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:Any
和T:Any?
都返回null
T:Any?
。 当返回types为T:Any
被调用时,由Mockito返回的null
值将失败由Kotlin编译器插入的运行时检查。 在调用settingDependentObject
之前抛出错误。
在types参数上添加T : Any
约束时,实际上使其非空: T
是Any
子types, Any
不能包含空值。
由于该函数是内联的,并且具有一个特定的types参数,所以该参数被替换为一个真正的非空types。 因此,在呼叫站点执行空检查,所以你得到这个例外。