Odpowiedzi:
Nazywa się je typami platform i oznaczają, że Kotlin nie wie, czy ta wartość może, czy nie może być, null
i to do Ciebie należy decyzja, czy jest dopuszczalna, czy nie.
W skrócie, problem polega na tym, że każde odwołanie pochodzące z Javy może mieć wartość null, a Kotlin, będąc z założenia bezpiecznym dla wartości null, zmusił użytkownika do sprawdzenia każdej wartości Javy lub użycia bezpiecznych wywołań (
?.
) lub asercji niezerowych (!!
). Te bardzo przydatne funkcje w czystym świecie Kotlina mają tendencję do przekształcania się w katastrofę, gdy trzeba ich używać zbyt często w ustawieniach Kotlin / Java.Dlatego podjęliśmy radykalne podejście i sprawiliśmy, że system typów Kotlin jest bardziej zrelaksowany, jeśli chodzi o interop w Javie: teraz odwołania pochodzące z Javy mają specjalnie oznaczone typy - Blog Kotlin
To notacja dla typów platform :
T!
oznacza „ T
lub T?
”
T
oznacza „ T!
lub T?
”
T
ten sposób został
Typ oznaczony jako !
jest nazywany typem platformy , który jest typem pochodzącym z języka Java i najprawdopodobniej może nim być null
. To jest to, co kompilator Kotlin domyślnie wnioskuje podczas wywoływania Javy (w najbardziej podstawowych przypadkach metody Java mogą być opatrzone adnotacjami, aby to obejść). Typy platform należy obsługiwać jako typy dopuszczające wartość null , chyba że na pewno wiesz, że określony interfejs API nigdy nie zwróci null
. Kompilator umożliwia przypisywanie typów platform do zmiennych typu dopuszczającego wartość null i niezerowego.
[…]
T!
oznacza „T or T?
” [...]
Możesz odnosić się do typów platform jako „typy nieznanych wartości zerowych ”. Ważne jest również, aby wiedzieć, że nie możesz używać wykrzyknika dla własnych typów, nie jest to część składni Kotlina, to tylko notacja .
Nazwy typów lub nazwy klas kończące się pojedynczym wykrzyknikiem !
nazywane są w Kotlinie typami platform . Znajdziesz je, gdy pracujesz w Kotlin ze starym kodem Java, który nie zawiera informacji o wartości null.
Na przykład:
@Nullable String
w Javie jest uważany za String?
Kotlina.
@NotNull String
w Javie jest uważany za String
Kotlina.
String
bez adnotacji w Javie jest uważany za String!
Kotlina.
Możesz pracować z typem platformy jako dopuszczającą wartość null lub inną niż null. Kompilator pozwoli ci wywołać wszystkie metody tego typu. To Ty odpowiadasz za to, jak ich używać. Jeśli wiesz, że wartość może być zerowa, powinieneś porównać ją z wartością null przed wywołaniem na niej metod. Jeśli wiesz, że nie jest null, możesz go użyć bezpośrednio, ale tak jak w Javie, otrzymasz wyjątek, jeśli twoje założenie dotyczące wartości null jest błędne.
Zauważ, że nie możesz deklarować typów platform w kodzie Kotlin, pochodzą one tylko z kodu Java.
Podczas zastępowania metod Java w kodzie Kotlin masz możliwość deklarowania parametrów i zwracania typów jako dopuszczających wartość null lub niezerową. Musisz wybrać to mądrze, ponieważ jeśli zdecydujesz, aby parametry były inne niż null, kompilator Kotlin generuje niezerowe potwierdzenia dla tych niezerowych parametrów. A kiedy następnym razem uzyskasz dostęp do tego kodu Kotlin z powrotem z Java i przekażesz wartość null, otrzymasz wyjątek.
Mam nadzieję, że pomoże to wyjaśnić wszystkie Twoje wątpliwości dotyczące typów platform.
Widziałem to kilka razy, szczególnie podczas korzystania z API Java
Jak wspomniano w s1m0nw1, T!
czyli T or T?
. Następne pytanie brzmi: co to jest T?
? Jest to ładnie udokumentowane na https://kotlinlang.org/docs/reference/null-safety.html . Kotlin nie pozwala na to null
, by pewne elementy były np. String
Odmienne od Javy
Aby zezwolić na wartości null, możemy zadeklarować zmienną jako ciąg dopuszczający wartość null, zapisany jako String ?:
var b: String? = "abc" b = null // ok
[…]
b?.length
Zwraca b.length, jeśli b nie jest null, lub null w przeciwnym razie. Typ tego wyrażenia to
Int?
.
Fragment z typów platform w Kotlinie :
Oprócz jawnego określenia typu jako opcjonalnego (np.
Person?
), Kotlin przedstawia nam inną bestię, wywołanąPlatform Type
, określoną przez wstawienie pojedynczego wykrzyknika (npPerson!
.). Ta koncepcja została stworzona ze względu na kompatybilność podczas uzyskiwania dostępu do kodu z zerowych platform, takich jak Java. Często zdarza się, że podczas korzystania z biblioteki Javy zwraca się wiele metodSomeType!
, ponieważ kompilator Kotlin nie może wywnioskować, czy wynik jest dopuszczalny, czy nie.
Na przykład:
(Mutable)Collection<T>!
Oznacza po prostu: „ Kolekcja Java T może być modyfikowalna lub nie, może mieć wartość null lub nie ”.
Mam nadzieję że to pomoże.
platform types