Kotlin приведение int к плавающему - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь выучить Kotlin, и я только что сделал программу калькулятора из консоли. У меня есть функции для суммирования, деления et c. И когда я пытаюсь привести к целым числам с плавающей точкой, я получаю эту ошибку:

Исключение в потоке "main" java .lang.ClassCastException: java .lang.Integer не может быть приведено к java .lang.Float

Функция такова:

fun divide(a:Int,b:Int):Float{
    return a as Float / b as Float;
}

Что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 10 апреля 2020

Чтобы подтвердить другие ответы и исправить то, что кажется распространенным недоразумением в Kotlin, я хотел бы выразить это следующим образом:

Приведение не преобразование значение в другой тип; приведение обещает компилятору, что значение уже равно нового типа.

Если у вас была ссылка Any или Number, которая указала на Float object:

val myNumber: Any = 6f

Тогда вы можете привести его к Float:

myNumber as Float

Но это работает только потому, что объект уже равен a Float; мы просто должны сказать компилятору. Это не сработает для другого типа цифр c; следующее даст ClassCastException:

myNumber as Double

в преобразование числа, вы не используете приведение; Вы используете одну из функций преобразования , например:

myNumber.toDouble()

Может возникнуть некоторая путаница из-за того, что такие языки, как C и Java были довольно слабы по отношению к цифрам c Типы и выполнять тихие преобразования во многих случаях. Это может быть довольно удобно; но это также может привести к тонким ошибкам. Для большинства разработчиков низкоуровневое переключение битов и вычисления менее важны, чем 40 или даже 20 лет go, и поэтому Kotlin перемещает некоторые из специальных числовых случаев c в стандартную библиотеку и требует явные преобразования, обеспечивающие дополнительную безопасность.

0 голосов
/ 10 апреля 2020

другой способ

fun divide(a: Int, b: Int) = a.div(b).toFloat()
0 голосов
/ 09 апреля 2020

Как говорится, Int не может быть брошен на Float. Однако и kotlin.Int, и kotlin.Float наследуют kotlin.Number, что определяет abstract fun toFloat(): Float. Это то, что вам нужно в этом сценарии.

fun divide(a:Int, b:Int): Float {
  return a.toFloat() / b.toFloat()
}

Пожалуйста, обратитесь к https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/to-float.html для получения дополнительной информации.

0 голосов
/ 09 апреля 2020

Трассировка стека исключения в значительной степени объяснила, почему приведение никогда не может быть успешным:

java .lang.Integer не может быть приведено к java .lang.Float

Ни один из классов java.lang.Integer и java.lang.Float не расширяет другой, поэтому вы не можете разыграть java.lang.Integer до java.lang.Float (или наоборот) с as.

Вы должны использовать .toFloat().

fun divide(a: Int, b: Int): Float {
    return a.toFloat() / b
}
...