Почему я не могу назначить тип NULL в Kotlin? - PullRequest
0 голосов
/ 19 февраля 2019

Может кто-нибудь объяснить, почему это невозможно сделать в Kotlin?

val x :Int? = 123
val y :Any = x

Я пришел из .NET-фона, где тип Nullable назначается типу объекта, но чем они отличаются?

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Обнуляемые типы не являются подтипами Any, но они являются подтипами Any?.

Any является только суперклассом ненулевых типы.Это позволяет писать код, который требует ненулевой экземпляр чего-либо, и при этом все еще выигрывает от безопасности средства проверки типов (в отличие от использования Object в Java).

Вот изображение, которое можетhelp:

enter image description here

Ваш правильный код замены:

val x: Int? = 123
val y: Any? = x
0 голосов
/ 19 февраля 2019

1-я строка кода val x :Int? = 123 ясно говорит, что x должен содержать значение типа Int Kotlin предоставляет встроенный тип Int, который используется для представления чисел.

В следующей строке, val y :Any = x, предполагается, что y содержит тип Any, который является корнем иерархии классов Kotlin.Каждый класс Kotlin имеет Any в качестве суперкласса.

Таким образом, существует несоответствие типов - и, следовательно, компилятор Kotlin жалуется, что он не может присвоить Int объекту, который вы объявили для хранения типа Any

0 голосов
/ 19 февраля 2019

Да.Основное требование для переменной Kotlin - помечать, является ли она Nullable или нет, чтобы избежать NPE.

Здесь, в вашем случае,

var x: Int? = 123

присваивается как значение NULL для NULL.но когда вы сопоставили его с любым объектом, вы пропустили добавить nullable?к любому объекту

, поэтому var y: Any? = x

будет делать так, как мы помечаем также обнуляемый для вас.

0 голосов
/ 19 февраля 2019

Из документов:

Система типов Котлина нацелена на устранение опасности нулевых ссылок из кода, также известного как Ошибка в миллиард долларов.

В Kotlin система типов различает ссылки, которые могут содержать нуль (недействительные ссылки), и те, которые не могут (ненулевые ссылки).

Пример:

var a: String = "abc"
a = null // compilation error

var b: String? = "abc" //using `String?` allows you to assign null
b = null // ok
print(b)

Any - это класс, аналогичный String, с той лишь разницей, что каждый класс имеет Any в качестве суперкласса.Но то, что я написал относительно NPE, применимо ко всем типам в kotlin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...