Die Testklasse unten, bestanden.Was ist der Unterschied von <reified T> mit <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())
}
}
Aber wenn wir von
private inline fun <reified T> anyObject(): T {
return Mockito.anyObject<T>()
}
zu
private inline fun <reified T: Any> anyObject(): T {
return Mockito.anyObject<T>()
}
Es mit
java.lang.IllegalStateException: Mockito.anyObject<T>() must not be null
fehl ändern, was die verschiedenen von <reified T>
mit <reified T: Any>
in Kotlin ist?
AKTUALISIERT Mit der Antwort, dass jeder Nicht-Null ist, dann <reified T: Any>
verwenden, sollten Fehler nicht zurück, da settingDependentObject(...)
erklärt ein nicht-Null-Argument zu empfangen. Ich würde erwarten, <reified T>
sollte stattdessen Fehler aus, aber es ist das Gegenteil von dem, was ich verstehe.
Habe ich etwas falsch verstanden?
Mögliche Duplikate von [Kotlin: Generics, Reflexion und der Unterschied zwischen Typ T und T: Beliebige] (http://stackoverflow.com/questions/35602231/kotlin-generics-reflection-and-the-difference-between- type-t-and-tany) – hotkey
Mockito.anyObject ist eine Java-Methode und gibt Platform-Type "Any!" Dieser Typ kann null- oder nullfähig sein. Der Kotlin-Compiler wird dort nichts ableiten (weil Null-Checks für jeden Plattform-Typ laut sind). Wenn du also "Any!" Bei einem "Any" kann dies zur Laufzeit fehlschlagen. siehe: https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types –
D3xter