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


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

4 63

4 ответа:

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

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

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

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

T! значит "T или T?"

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

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

[...]

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

вы можете ссылаться на типы платформ как " типы неизвестные значения null". Также важно знать, что вы не можете использовать восклицательный знак для своих собственных типов,это не часть Котлин синтаксис, это всего лишь нотация.

Я видел это несколько раз, особенно при использовании Java API

как упоминалось s1m0nw1,T! означает T or T?. Следующий вопрос: Что такое T?? Это хорошо документировано в https://kotlinlang.org/docs/reference/null-safety.html. Котлин не позволяет некоторым элементам быть null, например,String, в отличие от Java

чтобы разрешить нули, мы можем объявить переменную как строку с нулевым значением, написанную Струна?:

var b: String? = "abc"
b = null // ok

[...]

b?.length 

это возвращает B. length если b не null, и null в противном случае. Тип этого выражения Int?.