Pojedynczy wykrzyknik w Kotlinie

141

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.

Mibac
źródło

Odpowiedzi:

155

Nazywa się je typami platform i oznaczają, że Kotlin nie wie, czy ta wartość może, czy nie może być, nulli 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

Mibac
źródło
2
To wszystko dobrze powiedziane i zrobione. Jednak po prostu nie czuję się dobrze nazywanie tegoplatform types
JaydeepW
61

To notacja dla typów platform :

T!oznacza „ Tlub T?

voddan
źródło
Dlaczego nie Toznacza „ T!lub T?
Arst
T! oznacza niepodlegającą wartości null, T? oznacza wartość zerową. Dlaczego Kotlin tego nie robi ...
Arst
4
Ponieważ najlepszą wartością domyślną jest „nie dopuszcza wartości null” z oczywistych powodów, a dobrym rozwiązaniem jest ustawienie domyślnej sygnatury najkrótszego typu. W Tten sposób został
uznany za „nieważny
13

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.

Notacja dla typów platform

[…]

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 .

s1m0nw1
źródło
Zwroty typu „najprawdopodobniej” nie pomagają
Ewan
9

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 Stringw Javie jest uważany za String?Kotlina.

Informacje niezerowe: typ niezerowy

@NotNull Stringw Javie jest uważany za StringKotlina.

Brak informacji: typ platformy

Stringbez adnotacji w Javie jest uważany za String!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.

Yogesh Umesh Vaity
źródło
3

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

serv-inc
źródło
0

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 (np Person!.). 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 metod SomeType!, 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.

Andy Fedoroff
źródło