Ich versuche in Kotlin nach einem generischen Typ zu suchen.
if (value is Map<String, Any>) { ... }
Aber der Compiler beschwert sich bei
Beispiel für gelöschten Typ kann nicht überprüft werden: jet.Map
Die Prüfung mit einem normalen Typ funktioniert gut.
if (value is String) { ... }
Kotlin 0.4.68 wird verwendet.
Was fehlt mir hier?
generic-programming
kotlin
Philipp Brüll
quelle
quelle
Collection<String>
automatisches Casting ist?if (it.getSerializable(ARG_PARAMS) is HashMap<*, *>) {it.getSerializable(ARG_PARAMS) as HashMap<String, String>} else null
. Im Grunde wird es versuchen zu besetzenHashMap<String, Integer>
,HashMap<String, String>
wenn ich gegen generischen Typ prüfe. Vermisse ich etwasJVM entfernt die generischen Typinformationen. Aber Kotlin hat Generika verdichtet. Wenn Sie einen generischen Typ T haben, können Sie den Typparameter T einer Inline-Funktion als bestätigt markieren, damit sie zur Laufzeit überprüft werden kann.
So können Sie tun:
inline fun <reified T> checkType(obj: Object, contract: T) { if (obj is T) { // object implements the contract type T } }
quelle
checkType()
? Ich bin mir nicht sicher, was ich für das zweite Argument tun soll.Ich denke, das ist angemessener
inline fun <reified T> tryCast(instance: Any?, block: T.() -> Unit) { if (instance is T) { block(instance) } }
Verwendung
// myVar is nullable tryCast<MyType>(myVar) { // todo with this e.g. this.canDoSomething() }
Ein weiterer kürzerer Ansatz
inline fun <reified T> Any?.tryCast(block: T.() -> Unit) { if (this is T) { block() } }
Verwendung
// myVar is nullable myVar.tryCast<MyType> { // todo with this e.g. this.canDoSomething() }
quelle
something as? String
dasselbe? Beachten Sie das Fragezeichen nachas
?