Risposte:
Si chiamano tipi di piattaforma e significano che Kotlin non sa se quel valore può o non può essere null
e 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
È la notazione per i tipi di piattaforma :
T!
significa " T
o T?
"
T
significa " T!
o T?
"
T
fu reso "non nullable", e il resto era più o meno arbitrario
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 .
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:
@Nullable String
in Java è considerato come String?
da Kotlin.
@NotNull String
in Java è considerato come String
da Kotlin.
String
senza annotazioni in Java è considerato come String!
da Kotlin.
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.
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.
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?
.
Estratto dai tipi di piattaforma in Kotlin :
Oltre a specificare esplicitamente un tipo come facoltativo (ad esempio
Person?
), Kotlin ci presenta un'altra bestia, chiamataPlatform Type
, specificata mettendo invece un singolo punto esclamativo (ad esempioPerson!
). 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 metodiSomeType!
, 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.
platform types