В вашем примере b
- это значение Double
с плавающей точкой, а не Int
.(Как указали другие ответы.) Чтобы преобразовать его, вам нужно использовать что-то вроде b.toInt()
.
Ваша программа не преобразует его, потому что оператор as
Котлина не делает 't изменить значение на новый тип;вместо этого он сообщает компилятору, что значение уже требуемого типа. Это называется cast .
Так, например, если у меня есть:
val n: Number = 4
Тогда тип n
равен Number
.Его текущим значением на самом деле является Int
(который является подклассом Number
).Так что в этом случае я могу привести его к Int
, например:
val i = n as Int
, после чего компилятор обработает как Int
.
(Этот частный случай - понижающий , потому что Int
ниже Number
в иерархии классов. В целом, повышающие значения безопасны, но понижающие и другие нет. Если у вас быловместо этого инициализируется n
числом с плавающей запятой, тогда его значение будет иметь тип Double
, который является другим подклассом Number
, а не Int
; программа завершится с ошибкой во время выполнения и выдастClassCastException
, как вы видели. Вот почему у Kotlin также есть оператор безопасного приведения, as?
, который дает ноль вместо исключения.)
Компилятор Kotlin очень умен, и большую часть временион уже знает, какой тип может быть значением, поэтому приведение не требуется очень часто.Все еще могут быть случаи, когда вы знаете что-то, чего нет у компилятора, и приведение типа подходит;но слишком многие из них могут быть «запахом кода», указывающим, что может быть лучший подход.