примитивные типы в Котлине всегда в коробке? [Дубликат]

Перед открытием проверьте состояние соединения:

if (con.State != ConnectionState.Open)
    con.Open(); 
30
задан ajax992 31 July 2017 в 16:18
поделиться

2 ответа

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

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

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

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

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

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

37
ответ дан hotkey 15 August 2018 в 22:15
поделиться

Это потому, что 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()
11
ответ дан Basil Bourque 15 August 2018 в 22:15
поделиться
  • 1
    @BasilBourque привет, извините, я не умею по-английски. Как насчет этого сейчас? – holi-java 31 July 2017 в 16:27
  • 2
    Я понимаю техническую проблему, но английский не был ясен. Я отредактировал текст в ответе, чтобы уточнить. И ваш английский неплох, довольно хороший и ясный на самом деле, только этот глюк. – Basil Bourque 31 July 2017 в 16:37
  • 3
    @BasilBourque хорошая работа, спасибо большое. – holi-java 31 July 2017 в 16:37
Другие вопросы по тегам:

Похожие вопросы: