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