2016-02-24 8 views
10

Wenn ich versuche, die Java eines generischen Typs T die Kotlin Compiler zugreifen beschwert sich, dass T nicht ein Subtyp von kotlin.Any istKotlin: Generics, der Reflexion und der Unterschied zwischen Typ T und T: Jede

class Foo<T> (val t: T){ 
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any 
} 

Wenn definieren T als Subtyp von Any funktioniert alles ok.

class Bar<T:Any> (val t: T){ 
    val cls = t.javaClass // OK 
} 

Q1) Wenn Typ'T' kein Subtyp von'Any' ist die Klasse/Klassen es ein Subtyp sein kann?

Q2) Gibt es eine JavaClass für alle Instanzen von T und wenn ja, wie kann ich darauf zugreifen?

Antwort

11

Der Standardwert generic upper bound ist nicht Any, sondern Any?.

Dies bedeutet auch, dass es nicht null-sicher ist, ein javaClass von einem Nullable-Argument zu erhalten.

Um ein javaClass von einer generischen Typ-Instanz mit Any? oberer Schranke zu erhalten, können Sie es zu Any Stimmen:

val cls = (t as Any).javaClass //unsafe 
val clsOrNull = (t as? Any)?.javaClass //safe 
+1

Eine Sache, die mich aber puzzels Deshalb muß ich nur für generische Typen gegossen. Für ein generisches t 'var clsOfT = t? .javaClass' ergibt dies einen Kompilierungsfehler, aber für einen regulären Typ' var a: Any? = "A"; var clsOfA = a? .javaClass' das ist ok, obwohl beide die obere haben ': Any?'? –

+1

@TomasKarlsson, +1, sieht aus wie eine Besonderheit von Kotlin-Generika. Ich werde die Antwort finden. – hotkey

+0

Erläuterung zu dem oben genannten: 't 'ist eine Eigenschaft des generischen Typs' T' –

Verwandte Themen