Was bedeutet ein einzelnes Ausrufezeichen in Kotlin? Ich habe es einige Male gesehen, besonders wenn ich Java-APIs verwende. Aber ich konnte es weder in der Dokumentation noch in StackOverflow finden.
Sie werden als Plattformtypen bezeichnet und bedeuten, dass Kotlin nicht weiß, ob dieser Wert sein kann oder nicht, null
und es liegt an Ihnen, zu entscheiden, ob er nullwertfähig ist oder nicht.
Kurz gesagt, das Problem besteht darin, dass jede von Java stammende Referenz null sein kann und Kotlin, da es von Natur aus null-sicher ist, den Benutzer gezwungen hat, jeden Java-Wert auf Null zu prüfen oder sichere Aufrufe (
?.
) oder Nicht-Null-Zusicherungen () zu verwenden!!
). Diese Funktionen sind in der reinen Kotlin-Welt sehr praktisch und werden zu einer Katastrophe, wenn Sie sie in der Kotlin / Java-Umgebung zu oft verwenden müssen.Aus diesem Grund haben wir einen radikalen Ansatz gewählt und das Typensystem von Kotlin in Bezug auf Java Interop entspannter gestaltet: Jetzt haben Referenzen aus Java speziell gekennzeichnete Typen - Kotlin Blog
platform types
Es ist die Notation für Plattformtypen :
T!
bedeutet "T
oderT?
"quelle
T
bedeutet nicht "T!
oderT?
"T
wurde "nicht nullbar" gemacht, und der Rest war mehr oder weniger willkürlichEin mit notierter Typ
!
wird als Plattformtyp bezeichnet. Dies ist ein Typ, der aus Java stammt und daher höchstwahrscheinlich sein kannnull
. Dies schließt der Kotlin-Compiler standardmäßig beim Aufrufen von Java (in den grundlegendsten Fällen können Java-Methoden mit Anmerkungen versehen werden , um dies zu umgehen ). Sie sollten Plattformtypen als nullfähige Typen behandeln, es sei denn, Sie wissen mit Sicherheit, dass die jeweilige API niemals zurückkehren wirdnull
. Mit dem Compiler können Plattformtypen Variablen zugewiesen werden, die sowohl nullbar als auch nicht null sind.Sie können Plattformtypen als "Typen unbekannter Nullfähigkeit " bezeichnen. Es ist auch wichtig zu wissen, dass Sie den mit Ausrufezeichen gekennzeichneten Typ nicht für Ihre eigenen Typen verwenden können. Er ist nicht Teil der Kotlin-Syntax, sondern nur eine Notation .
quelle
Die Typnamen oder Klassennamen, die mit einem einzelnen Ausrufezeichen enden,
!
werden in Kotlin als Plattformtypen bezeichnet . Sie finden sie, wenn Sie in Kotlin mit altem Java-Code arbeiten, der keine Informationen zur Nullbarkeit enthält.Beispielsweise:
Nullable Information: Nullable Type
@Nullable String
in Java wirdString?
von Kotlin als betrachtet.Nicht-Null-Informationen: Nicht-Null-Typ
@NotNull String
in Java wirdString
von Kotlin als betrachtet.Keine Information: Plattformtyp
String
ohne Anmerkungen in Java wirdString!
von Kotlin als betrachtet.Wie gehe ich mit Plattformtypen um?
Sie können mit einem Plattformtyp entweder als nullbar oder als nicht null arbeiten. Mit dem Compiler können Sie alle Methoden dieses Typs aufrufen. Es liegt in Ihrer Verantwortung, wie Sie sie verwenden. Wenn Sie wissen, dass der Wert null sein kann, sollten Sie ihn mit null vergleichen, bevor Sie Methoden dafür aufrufen. Wenn Sie wissen, dass es nicht null ist, können Sie es direkt verwenden, aber wie in Java erhalten Sie eine Ausnahme, wenn Ihre Annahme über die Nullfähigkeit falsch ist.
Beachten Sie, dass Sie Plattformtypen im Kotlin-Code nicht deklarieren können, sie stammen nur aus Java-Code.
Vererbungs- und Plattformtypen
Während Sie Java-Methoden im Kotlin-Code überschreiben, haben Sie die Möglichkeit, Parameter zu deklarieren und Typen als nullbar oder nicht null zurückzugeben. Sie müssen dies mit Bedacht auswählen, da der Kotlin-Compiler für diese Nicht-Null-Parameter Nicht-Null-Zusicherungen generiert, wenn Sie die Parameter nicht null machen. Wenn Sie das nächste Mal von Java aus auf diesen Kotlin-Code zugreifen und einen Nullwert übergeben, erhalten Sie eine Ausnahme.
Ich hoffe, das hilft, alle Ihre Zweifel an Plattformtypen auszuräumen.
quelle
Wie von s1m0nw1 erwähnt,
T!
bedeutetT or T?
. Die nächste Frage ist: Was istT?
? Dies ist unter https://kotlinlang.org/docs/reference/null-safety.html gut dokumentiert . Kotlin lässt bestimmte Elemente nicht zunull
, zString
anders als Java sindquelle
Auszug aus Plattformtypen in Kotlin :
Beispielsweise:
Bedeutet nur Folgendes: "Die Java-Sammlung von T kann veränderlich sein oder nicht, kann nullbar sein oder nicht ".
Hoffe das hilft.
quelle