Відповіді:
Їх називають типами платформ, і вони означають, що Котлін не знає, чи може це значення бути, чи не може бути, null
і ви вирішуєте, чи є це нульовим чи ні.
Коротше кажучи, проблема полягає в тому, що будь-яка посилання, що надходить від Java, може бути нульовою, і Котлін, будучи безпечним для дизайну, змусив користувача перевірити всі значення Java або використовувати безпечні виклики (
?.
) або ненульові твердження (!!
). Ті, що є дуже зручними функціями у чистому світі Котліна, як правило, перетворюються на катастрофу, коли доводиться використовувати їх занадто часто в налаштуваннях Котлін / Ява.Ось чому ми застосували радикальний підхід і зробили систему типу Котліна більш розслабленою, коли справа стосується Java interop: тепер посилання, що надходять з Java, мають спеціально марковані типи - Kotlin Blog
Це позначення для типів платформи :
T!
означає " T
або T?
"
T
означає " T!
чи T?
"
T
був зроблений "нерегульований", а решта була більш-менш довільною
Тип, позначений символом !
, називається типом платформи , який є типом, що походить від Java, і, таким чином, це, швидше за все, може бути null
. Це те, що компілятор Kotlin робить висновок за замовчуванням під час виклику Java (для найосновніших випадків методи Java можна помітити, щоб уникнути цього). Вам слід обробляти типи платформ як нульові типи, якщо ви точно не знаєте, що конкретний API ніколи не повернеться null
. Компілятор дозволяє присвоювати типи платформи змінним як нульових, так і ненульових типів.
Позначення для типів платформи
[...]
T!
означає "T or T?
" [...]
Типи платформи можна назвати як "типи невідомої зведеності ". Також важливо знати, що ви не можете використовувати знак оклику для власних типів, це не є частиною синтаксису Котліна, це лише позначення .
Назви типів або назви класів, що закінчуються одним окличним знаком !
, в Котліні називаються типами платформи . Ви знаходите їх під час роботи в Котліні зі старим кодом Java, який не містить інформації про зведеність.
Наприклад:
@Nullable String
на Яві вважається String?
Котліном.
@NotNull String
на Яві вважається String
Котліном.
String
без анотацій на Java вважається String!
Котліном.
Ви можете працювати з типом платформи як з нульовим, так і з ненульовим значенням. Компілятор дозволить вам викликати всі методи цього типу. Це ваша відповідальність, як ними користуватися. Якщо ви знаєте, що значення може бути нульовим, слід порівняти його з null, перш ніж викликати методи на ньому. Якщо ви знаєте, що це не нуль, ви можете використовувати його безпосередньо, але як у Java, ви отримаєте виняток, якщо ваші припущення про мінливість помилкові.
Зауважте, що типи платформ не можна оголошувати в коді Котліна, вони надходять лише з коду Java.
Перевіряючи методи Java у коді Котліна, у вас є можливість оголосити параметри та типи повернення як нульові чи ненульові. Вибирати це потрібно розумно, тому що якщо ви вирішили зробити параметри ненульовими, компілятор Kotlin генерує ненульові твердження для цих ненульових параметрів. І коли наступного разу, коли ви повернетесь до цього котла Котліна з Java та передасте нульове значення, ви отримаєте виняток.
Сподіваємось, що допоможе усунути всі ваші сумніви щодо типів платформи.
Я бачив це кілька разів, особливо під час використання API Java
Як згадує s1m0nw1, T!
означає T or T?
. Наступне питання: що таке T?
? Це добре задокументовано на https://kotlinlang.org/docs/reference/null-safety.html . Kotlin не дозволяє певних елементів бути null
, наприклад String
, на відміну від Java
Щоб дозволити нулі, ми можемо оголосити змінну як нульову рядок, написану String ?:
var b: String? = "abc" b = null // ok
[...]
b?.length
Це повертає b.length, якщо b не є null, а null інакше. Тип цього виразу є
Int?
.
Витяг з типів платформ у Котліні :
Окрім того, що явно вказав тип як необов'язковий (наприклад
Person?
), Котлін представляє нам іншого звіра, який називаєтьсяPlatform Type
, визначеного, поставивши замість нього один знак оклику (наприкладPerson!
). Ця концепція була створена з міркувань сумісності під час доступу до коду з нульових небезпечних платформ, таких як Java. Часто трапляється так, що при використанні бібліотеки Java багато методів повертаютьсяSomeType!
, оскільки компілятор Kotlin не може зробити висновок, якщо результат є нульовим чи ні.
Наприклад:
(Mutable)Collection<T>!
Просто означає наступне: " Колекція Java з T може бути зміненою чи ні, може бути змінною чи ні ".
Сподіваюся, це допомагає.
platform types