Co oznacza pojedynczy wykrzyknik w Kotlinie? Widziałem to kilka razy, szczególnie podczas korzystania z API Java. Ale nie mogłem go znaleźć w dokumentacji ani na StackOverflow.
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
platform types
To notacja dla typów platform :
T!
oznacza „T
lubT?
”źródło
T
oznacza „T!
lubT?
”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ócinull
. Kompilator umożliwia przypisywanie typów platform do zmiennych typu dopuszczającego wartość null i niezerowego.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 .
źródło
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:
Informacje dopuszczające wartość zerową: typ dopuszczający wartość zerową
@Nullable String
w Javie jest uważany zaString?
Kotlina.Informacje niezerowe: typ niezerowy
@NotNull String
w Javie jest uważany zaString
Kotlina.Brak informacji: typ platformy
String
bez adnotacji w Javie jest uważany zaString!
Kotlina.Jak radzić sobie z typami platform?
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.
Dziedziczenie i typy platform
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.
źródło
Jak wspomniano w s1m0nw1,
T!
czyliT or T?
. Następne pytanie brzmi: co to jestT?
? Jest to ładnie udokumentowane na https://kotlinlang.org/docs/reference/null-safety.html . Kotlin nie pozwala na tonull
, by pewne elementy były np.String
Odmienne od Javyźródło
Fragment z typów platform w Kotlinie :
Na przykład:
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.
źródło