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.

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


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?"


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 .


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.


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?.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.