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

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

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

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

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

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

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

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

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

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

В Котлине нет неявных расширяющихся преобразований чисел . например, вы можете написать что-то на 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() 
Intereting Posts
Объединение нулевой безопасности и assertNotNull Как создать экземпляр объекта с использованием значений параметров конструктора по умолчанию в Kotlin? Неиспользуемые аргументы при уничтожении объекта в Котлине Как ссылаться на конструктор запечатанного в Котлин? Как скомпилировать проект Java + Kotlin с использованием Maven? Перегрузка конструктора с помощью Kotlin Невозможно повторно использовать параметры функции Сравнить String Kotlin Плохой тип в стеке операндов с сопрограммами Kotlin Почему класс Kotlin не нужно открывать в Spring Boot больше Как я могу создать новую активность Android в Android Studio из проекта Explorer? Невыполнение результата по результату Как безопасно решить эту нулевую проверку в инициализаторе? Параметр аннотированного типа в Java для компилятора Kotlin Применение перечисления состоит из 3 адаптеров между 2 действиями в Котлине