Подтвердить что ты не робот

Являются ли типы данных Kotlin построены на примитивных или не примитивных типах данных Java?

Я новичок в Kotlin и играл с типами данных. Я взял тип Int, а затем попытался передать его как Double, сказав num as Double, вызов, действительный в java (не синтаксически, но вы получите точку). Однако это не удалось, сказав, что Int нельзя отнести к Double. Я предполагаю, что это связано с тем, что он построен из класса Integer, а не из типа данных raw int. Правильно ли, и каков наиболее эффективный способ создания значений? Существует функция .toDouble(), но это кажется неэффективным и громоздким.

4b9b3361

Ответ 1

Я взял тип Int, а затем попытался применить его как Double, сказав num as Double <... > Однако это не удалось, сказав, что Int нельзя передать в Double. Я предполагаю, что это связано с тем, что он построен вне класса Integer, а не типа raw Int.

Нет, и есть два важных момента:

  • Kotlin позиционирует свои числовые типы (Int, Long, Double и т.д.) как не вложенные друг в друга, существует no - это взаимосвязь между этими типы. То, почему актерский состав intNum as Double не удался в Котлине. Это также объясняет, почему между этими типами не происходит неявных преобразований. Вместо этого числовое преобразование выполняется с соответствующими функциями (например, .toDouble())

  • Числовые типы использования в Kotlin скомпилированы в примитивы JVM, где это возможно. Для некоторых видов использования требуются типы в штучной упаковке (например, нулевое значение Int? требует бокса, а также реализация общего типа с Int как аргумент типа), но компилятор решает, нужны ли они для каждого случая.

<... > Каков наиболее эффективный способ создания значений? Существует функция .toDouble(), но это кажется неэффективным и громоздким.

Наиболее эффективным способом является использование числовых функций преобразования, таких как .toDouble(). Фактически, эти функции являются неотъемлемыми, и при их использовании нет служебных вызовов функции. Они скомпилированы близко к тому, что javac будет производить для Java-числового литья или неявного преобразования. Вы можете проверить байт-код, который производит компилятор Kotlin, чтобы узнать, что он находится под капотом, и определяет ли конкретное преобразование какие-либо накладные расходы.

См. также: ответ на аналогичный вопрос, (ссылка)

Ответ 2

Это потому, что Kotlin не работает как Java в расширяющихся числах.

В Котлине нет неявных расширяющихся преобразований для numbers. например, вы можете написать что-то на Java, как показано ниже:

int a = 1;
double b = a;

Однако вы не можете написать что-то в Котлине. например:

val a:Int = 1  
//             v--- can't be widening
val b:Double = a

Это потому, что все в Котлине является объектом, нет примитивных типов, поэтому вы должны явно преобразовать Int в Double, например:

val a:Int = 1  
//               v--- convert it explicitly by `toDouble()` method
val b:Double = a.toDouble()