Перед открытием проверьте состояние соединения:
if (con.State != ConnectionState.Open)
con.Open();
Я взял тип
blockquote>Int
, а затем попытался записать его какDouble
, сказавnum as Double
& lt; ...> Однако это не удалось, сказав, что Int нельзя передать вDouble
, Я предполагаю, что это связано с тем, что он построен вне классаInteger
, а не для типа данных rawint
.Нет, и есть два важных момента:
- Котлин позиционирует свои числовые типы (
Int
,Long
,Double
и т. д. .), поскольку они не вложены друг в друга, между этими типами нет отношения подтипирования. Вот почему литьеintNum as Double
не удалось в Котлине. Именно поэтому нет никаких неявных преобразований между этими типами. Вместо этого числовое преобразование выполняется с помощью соответствующих функций (например,.toDouble()
)- Числовые типы использования в Kotlin скомпилированы в примитивы JVM, где это возможно. Некоторым обычаям требуются бокс-типы (например, nullable
Int?
требует бокса, а также реализация общего типа сInt
как аргумент типа), но компилятор решает, необходимы ли они для каждого случая.& lt; ...> Каков наиболее эффективный способ создания значений? Существует функция
blockquote>.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()