Punto esclamativo singolo in Kotlin


141

Cosa significa un singolo punto esclamativo in Kotlin? L'ho visto un paio di volte soprattutto quando si utilizzano API Java. Ma non sono riuscito a trovarlo nella documentazione né su StackOverflow.

Risposte:


155

Si chiamano tipi di piattaforma e significano che Kotlin non sa se quel valore può o non può essere nulle spetta a te decidere se è nullable o no.

In poche parole, il problema è che qualsiasi riferimento proveniente da Java può essere nullo e Kotlin, essendo design-null sicuro in base alla progettazione, ha costretto l'utente a controllare null ogni valore Java o utilizzare chiamate sicure ( ?.) o asserzioni non-null (!! ). Quelle che sono funzionalità molto utili nel puro mondo Kotlin, tendono a trasformarsi in un disastro quando devi usarle troppo spesso nell'impostazione Kotlin / Java.

Questo è il motivo per cui abbiamo adottato un approccio radicale e reso il sistema di tipi di Kotlin più rilassato quando si parla di interoperabilità Java: ora i riferimenti provenienti da Java hanno tipi appositamente contrassegnati - Kotlin Blog


2
Questo è tutto bene detto e fatto. Tuttavia, non mi sento bene a chiamarloplatform types
JaydeepW,

61

È la notazione per i tipi di piattaforma :

T!significa " To T?"


Perché non Tsignifica " T!o T?"
Arst

T! significa non annullabile, T? significa nullable. Perché Kotlin non lo fa ...
Prima del

4
Perché il valore predefinito migliore è "non annullabile" per ovvi motivi ed è una buona progettazione che il valore predefinito sia la firma del tipo più breve. Così Tfu reso "non nullable", e il resto era più o meno arbitrario
voddan

13

Un tipo annotato !si chiama tipo di piattaforma , che è un tipo proveniente da Java e quindi molto probabilmente può esserlo null. È ciò che il compilatore Kotlin deduce di default quando chiama Java (per i casi più elementari, i metodi Java possono essere annotati per aggirare questo). È necessario gestire i tipi di piattaforma come tipi nullable , a meno che non si sappia certamente che l'API specifica non verrà mai restituita null. Il compilatore consente di assegnare i tipi di piattaforma a variabili di tipo nullable e non null.

Notazione per i tipi di piattaforma

[...]

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

È possibile fare riferimento ai tipi di piattaforma come "tipi di nullità sconosciuta ". È anche importante sapere che non è possibile utilizzare il tipo esclamativo per i propri tipi, non fa parte della sintassi di Kotlin, è solo una notazione .


Frasi come "molto probabilmente" non aiutano
Ewan

9

I nomi dei tipi o dei nomi di classe che terminano con un punto esclamativo singolo !sono chiamati Tipi di piattaforma in Kotlin. Li trovi quando lavori a Kotlin con il vecchio codice Java che non contiene informazioni di nullability.

Per esempio:

Informazioni Nullable: Tipo Nullable

@Nullable Stringin Java è considerato come String?da Kotlin.

Informazioni non nulle: Tipo non nullo

@NotNull Stringin Java è considerato come Stringda Kotlin.

Nessuna informazione: tipo di piattaforma

Stringsenza annotazioni in Java è considerato come String!da Kotlin.


Come gestire i tipi di piattaforma?

Puoi lavorare con un tipo di piattaforma come nullable o non null. Il compilatore ti permetterà di chiamare tutti i metodi su questo tipo. È tua responsabilità come usarli. Se sai che il valore può essere nullo, dovresti confrontarlo con null prima di chiamare i metodi su di esso. Se sai che non è nullo, puoi usarlo direttamente ma come in Java, otterrai un'eccezione se la tua ipotesi sulla nullità è sbagliata.

Nota che non puoi dichiarare i tipi di piattaforma nel codice Kotlin, provengono solo dal codice Java.


Ereditarietà e tipi di piattaforma

Durante l'override dei metodi Java nel codice Kotlin, hai la possibilità di dichiarare i parametri e restituire i tipi come nullable o non null. Devi scegliere saggiamente, perché se decidi di rendere i parametri non nulli, il compilatore di Kotlin genera asserzioni non nulle per questi parametri non nulli. E la prossima volta che accedi a questo codice Kotlin di nuovo da Java e passi un valore nullo, otterrai un'eccezione.

Spero che ti aiuti a chiarire tutti i tuoi dubbi sui tipi di piattaforma.


3

L'ho visto un paio di volte soprattutto quando si utilizzano API Java

Come menzionato da s1m0nw1, T!significa T or T?. La prossima domanda è: che cos'è T?? Questo è ben documentato su https://kotlinlang.org/docs/reference/null-safety.html . Kotlin non consente a determinati elementi di essere null, ad esempio String, diversi da Java

Per consentire null, possiamo dichiarare una variabile come stringa nullable, scritta String ?:

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

[...]

b?.length 

Questo restituisce b.length se b non è null e null altrimenti. Il tipo di questa espressione è Int?.


0

Estratto dai tipi di piattaforma in Kotlin :

Oltre a specificare esplicitamente un tipo come facoltativo (ad esempio Person?), Kotlin ci presenta un'altra bestia, chiamata Platform Type, specificata mettendo invece un singolo punto esclamativo (ad esempio Person!). Questo concetto è stato creato per motivi di compatibilità, quando si accede al codice da piattaforme null-non sicure come Java. Spesso, quando si utilizza una libreria Java, vengono restituiti molti metodi SomeType!, poiché il compilatore di Kotlin non può dedurre se il risultato è nulla o no.

Per esempio:

(Mutable)Collection<T>! 

Significa semplicemente quanto segue: "La raccolta Java di T può essere mutabile o no, può essere nullable o no ".

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.