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