Ein einzelnes Ausrufezeichen in Kotlin

141

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.

Mibac
quelle

Antworten:

154

Sie werden als Plattformtypen bezeichnet und bedeuten, dass Kotlin nicht weiß, ob dieser Wert sein kann oder nicht, nullund 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

Mibac
quelle
2
Das ist alles gut gesagt und getan. Ich fühle mich jedoch nicht gut, platform types
wenn
61

Es ist die Notation für Plattformtypen :

T!bedeutet " Toder T?"

Voddan
quelle
Warum Tbedeutet nicht " T!oder T?"
Arst
T! bedeutet nicht nullbar, T? bedeutet nullable. Warum Kotlin das nicht tut ...
Arst
4
Weil der beste Standard aus offensichtlichen Gründen "nicht nullbar" ist und es ein gutes Design ist, wenn der Standard die kürzeste Typensignatur ist. So Twurde "nicht nullbar" gemacht, und der Rest war mehr oder weniger willkürlich
voddan
13

Ein mit notierter Typ !wird als Plattformtyp bezeichnet. Dies ist ein Typ, der aus Java stammt und daher höchstwahrscheinlich sein kann null. 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 wird null. Mit dem Compiler können Plattformtypen Variablen zugewiesen werden, die sowohl nullbar als auch nicht null sind.

Notation für Plattformtypen

[...]

T!bedeutet " T or T?" [...]

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 .

s1m0nw1
quelle
Sätze wie 'höchstwahrscheinlich' helfen nicht
Ewan
9

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 Stringin Java wird String?von Kotlin als betrachtet.

Nicht-Null-Informationen: Nicht-Null-Typ

@NotNull Stringin Java wird Stringvon Kotlin als betrachtet.

Keine Information: Plattformtyp

Stringohne Anmerkungen in Java wird String!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.

Yogesh Umesh Vaity
quelle
3

Ich habe es einige Male gesehen, besonders wenn ich Java-APIs verwende

Wie von s1m0nw1 erwähnt, T!bedeutet T or T?. Die nächste Frage ist: Was ist T?? Dies ist unter https://kotlinlang.org/docs/reference/null-safety.html gut dokumentiert . Kotlin lässt bestimmte Elemente nicht zu null, zString anders als Java sind

Um Nullen zuzulassen, können wir eine Variable als nullfähige Zeichenfolge deklarieren.

var b: String? = "abc"
b = null // ok

[...]

b?.length 

Dies gibt b.length zurück, wenn b nicht null ist, andernfalls null. Der Typ dieses Ausdrucks ist Int?.

serv-inc
quelle
0

Auszug aus Plattformtypen in Kotlin :

Person?Kotlin gibt nicht nur einen Typ explizit als optional an (z. B. ), sondern stellt uns auch ein anderes Tier vor, das aufgerufen wird Platform Typeund durch ein einzelnes Ausrufezeichen (z Person!. B. ) gekennzeichnet wird. Dieses Konzept wurde aus Kompatibilitätsgründen beim Zugriff auf Code von null unsicheren Plattformen wie Java erstellt. Es ist häufig der Fall, dass bei Verwendung einer Java-Bibliothek viele Methoden zurückgegeben werden SomeType!, da der Kotlin-Compiler nicht ableiten kann, ob das Ergebnis nullwertfähig ist oder nicht.

Beispielsweise:

(Mutable)Collection<T>! 

Bedeutet nur Folgendes: "Die Java-Sammlung von T kann veränderlich sein oder nicht, kann nullbar sein oder nicht ".

Hoffe das hilft.

Andy Fedoroff
quelle