La classe di test di seguito, passaggio.Qual è la differenza di <reified T> con <reified T: Any> in 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())
}
}
Ma se ci si sposta dall'attuale
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
a
private inline fun <reified T: Any> anyObject(): T {
return Mockito.anyObject<T>()
}
fallirà con
java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null
Qual è il diverso di <reified T>
con <reified T: Any>
in Kotlin?
AGGIORNATO Con la risposta che Any non è nullo, quindi utilizzando <reified T: Any>
non dovrebbe restituire l'errore, dal momento che settingDependentObject(...)
viene dichiarata la ricezione di un argomento non nullo. Mi aspetterei che l'errore <reified T>
si verifichi invece, ma è opposto a quello che ho capito.
Ho capito qualcosa di sbagliato?
Possibile duplicato di [Kotlin: Generics, reflection e la differenza tra type T e T: Any] (http://stackoverflow.com/questions/35602231/kotlin-generics-reflection-and-the-difference-between- type-t-and-tany) – hotkey
Mockito.anyObject è un metodo java e restituisce Platform-Type "Any!" Quel tipo può essere nullable o non annullabile. il compilatore kotlin non dedurrà nulla lì (perché avere controlli nulli per ogni tipo di piattaforma è rumoroso). quindi se assegni "Qualsiasi!" a un "Qualsiasi", questo può fallire in fase di runtime. vedere: https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types –
D3xter