Единственный восклицательный знак в Котлине


141

Что означает один восклицательный знак в Kotlin? Я видел это несколько раз, особенно при использовании Java API. Но я не смог найти его ни в документации, ни в StackOverflow.

Ответы:


155

Их называют типами платформ, и они означают, что Котлин не знает, может ли это значение быть или не быть, nullи вам решать, является ли оно пустым или нет.

В двух словах, проблема в том, что любая ссылка, исходящая из Java, может быть нулевой, и Kotlin, будучи нулево-безопасным по своей конструкции, заставлял пользователя проверять ноль каждую Java-величину или использовать безопасные вызовы ( ?.) или ненулевые утверждения ( !!). Это очень удобные функции в чистом мире Kotlin, которые, как правило, превращаются в катастрофу, когда вы слишком часто используете их в настройках Kotlin / Java.

Вот почему мы приняли радикальный подход и сделали систему типов Kotlin более удобной, когда речь заходит о взаимодействии с Java: теперь ссылки, поступающие из Java, имеют специально помеченные типы - Блог Kotlin


2
Это все хорошо сказано и сделано. Тем не менее, я просто не чувствую себя хорошо, называя этоplatform types
JaydeepW

61

Это обозначение для типов платформ :

T!означает « Tили T?»


Почему не Tозначает « T!или T?»
Орст

T! означает не обнуляемый, T? означает обнуляемый. Почему Котлин не делает этого ...
Arst

4
Потому что лучшим значением по умолчанию является «не обнуляемый» по понятным причинам, и это хороший дизайн, чтобы значение по умолчанию было самой короткой сигнатурой типа. Таким образом, Tбыл сделан «ненулевой», а остальное было более или менее произвольно
Воддан

13

A Тип нотированы с !называется тип платформы , который является типом исходя из Java и , таким образом , может быть , скорее всего null. Это то, что компилятор Kotlin выводит по умолчанию при вызове Java (в большинстве базовых случаев методы Java можно аннотировать, чтобы обойти это). Вы должны обрабатывать типы платформ как обнуляемые типы, если вы точно не знаете, что конкретный API никогда не вернется null. Компилятор позволяет назначать типы платформ переменным как обнуляемых, так и ненулевых типов.

Нотация для типов платформ

[...]

T!означает " T or T?" [...]

Вы можете ссылаться на типы платформ как «типы неизвестных обнуляемых ». Также важно знать, что вы не можете использовать восклицательный тип для своих собственных типов, это не часть синтаксиса Kotlin, это только нотация .


Фразы типа «скорее всего» не помогают
Юань

10

Имена типов или имена классов, заканчивающиеся одним восклицательным знаком !, называются типами платформ в Kotlin. Вы найдете их, когда работаете в Kotlin со старым кодом Java, который не содержит информации об обнуляемости.

Например:

Информация об Nullable: Тип Nullable

@Nullable Stringна Яве считается как String?у Котлина.

Не нулевая информация: не нулевой тип

@NotNull Stringна Яве считается как Stringу Котлина.

Нет информации: Тип платформы

StringБез аннотации на Java считается, как String!Котлин.


Как бороться с типами платформ?

Вы можете работать с типом платформы как обнуляемым, так и ненулевым. Компилятор позволит вам вызывать все методы этого типа. Это ваша ответственность, как их использовать. Если вы знаете, что значение может быть нулевым, вы должны сравнить его с нулевым, прежде чем вызывать методы для него. Если вы знаете, что это не null, вы можете использовать его напрямую, но, как и в Java, вы получите исключение, если ваше предположение об обнуляемости неверно.

Обратите внимание, что вы не можете объявлять типы платформ в коде Kotlin, они приходят только из кода Java.


Наследование и типы платформ

При переопределении методов Java в коде Kotlin у вас есть возможность объявить параметры и возвращаемые типы как обнуляемые или ненулевые. Вы должны выбрать это мудро, потому что, если вы решите сделать параметры ненулевыми, компилятор Kotlin генерирует ненулевые утверждения для этих ненулевых параметров. И когда в следующий раз вы получите доступ к этому Kotlin-коду обратно из Java и передадите нулевое значение, вы получите исключение.

Надеюсь, что это поможет очистить все ваши сомнения о типах платформ.


3

Я видел это несколько раз, особенно при использовании 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?.


0

Выдержка из Типы платформ в Котлине :

Помимо явного указания типа как необязательного (например Person?), Kotlin представляет нам еще одного зверя, называемого Platform Type, который указывается вместо одного восклицательного знака (например Person!). Эта концепция была создана из соображений совместимости при доступе к коду с небезопасных платформ, таких как Java. Часто бывает так, что при использовании библиотеки Java многие методы возвращаются SomeType!, поскольку компилятор Kotlin не может определить, является ли результат обнуляемым или нет.

Например:

(Mutable)Collection<T>! 

Просто означает следующее: « Java-коллекция T может быть изменчивой или нет, может быть обнуляемой или нет ».

Надеюсь это поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.