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