Типизация от Double до Float приводит к ClassCastException - PullRequest
0 голосов
/ 13 апреля 2020

Код: -

val num = 12.12
val num2: Float = num.toFloat() // Works
val num3: Float = num as Float // Exception

Исключение: -

Исключение в потоке "main" java .lang .ClassCastException: класс java .lang.Double нельзя привести к классу java .lang.Float (java .lang.Double и java .lang.Float находятся в модуле java .base загрузчика ' bootstrap ')

Может кто-нибудь сказать мне, почему num.toFloat() работает нормально, но num as Float выдает ошибку? Разве оба этих синтаксиса не должны делать одно и то же?

1 Ответ

3 голосов
/ 13 апреля 2020

Нет, они не делают одно и то же.

.toXxx() методы преобразовывают значение из одного типа в другой. Это может быть дистанционно связанный тип (например, List до String) или тесно связанный тип (например, Int до Float), но во всех случаях это разные типы, и они имеют разные значения .

as, однако, является cast . Приведение не преобразует значение в требуемый тип; приведение обещает компилятору, что значение уже необходимого типа. Если это не так, вы обнаружите ошибку, как вы обнаружили.

Языки, такие как C и Java довольно слабы в отношении числительных c типов и автоматически конвертируются между ними во многих обстоятельствах («числительное c продвижение»), что может быть причиной того, что вы путаете их. Это может быть довольно удобно; но это также может привести к тонким ошибкам. Таким образом, Kotlin делает намного меньше, обеспечивая дополнительную безопасность (что является одной из тем языка).

(Эта путаница кажется довольно распространенной; см., Например, этот вопрос только от 4 дня go.

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