Ответ 1
Я взял тип
Int
, а затем попытался применить его какDouble
, сказавnum as Double
<... > Однако это не удалось, сказав, что Int нельзя передать вDouble
. Я предполагаю, что это связано с тем, что он построен вне классаInteger
, а не типа rawInt
.
Нет, и есть два важных момента:
-
Kotlin позиционирует свои числовые типы (
Int
,Long
,Double
и т.д.) как не вложенные друг в друга, существует no - это взаимосвязь между этими типы. То, почему актерский составintNum as Double
не удался в Котлине. Это также объясняет, почему между этими типами не происходит неявных преобразований. Вместо этого числовое преобразование выполняется с соответствующими функциями (например,.toDouble()
) -
Числовые типы использования в Kotlin скомпилированы в примитивы JVM, где это возможно. Для некоторых видов использования требуются типы в штучной упаковке (например, нулевое значение
Int?
требует бокса, а также реализация общего типа сInt
как аргумент типа), но компилятор решает, нужны ли они для каждого случая.
<... > Каков наиболее эффективный способ создания значений? Существует функция
.toDouble()
, но это кажется неэффективным и громоздким.
Наиболее эффективным способом является использование числовых функций преобразования, таких как .toDouble()
. Фактически, эти функции являются неотъемлемыми, и при их использовании нет служебных вызовов функции. Они скомпилированы близко к тому, что javac будет производить для Java-числового литья или неявного преобразования. Вы можете проверить байт-код, который производит компилятор Kotlin, чтобы узнать, что он находится под капотом, и определяет ли конкретное преобразование какие-либо накладные расходы.
См. также: ответ на аналогичный вопрос, (ссылка)