Intereting Posts
Как реализовать этот интерфейс Java в Котлине? Может ли объект класса, созданный «на лету» в Котлине, иметь конструктор? Отображать информацию о состоянии в список участников динамически Сохранять двойные кавычки при получении элемента из JSONArray Как объявить итератор без его инициализации? (Котлин) Dagger2 и Kotlin запускают неудачные причины: app: compileDebugKotlinAfterJava где поставить скрипт, который запускается во всех / некоторых действиях в android? Котлин, уменьшить дублированный код Обновление для поддержки 27 и SDK 27 из 25, авария на Android 4.4 сейчас Как сделать возвращаемый тип функции переопределения одного выражения для Unit? RxJava zipWith Ошибка IDE в Kotlin с использованием Android Studio 3.0 Можно ли сопоставить функцию более высокого порядка в котлине с строкой Связать размер ObservableList в привязке к Android Требовать в суперклассе 'init block вызывает исключение IllegalArgumentException Попытка понять пример Котлина

Котлинское умножение между обнуляемыми и невалютными ошибками float даже с нулевой проверкой

Я ShapeData класс под названием ShapeData из Java, который заполнен типами NULL. Это выглядит так:

 class ShapeData { var type: Shape.Type? = null // Circle, Edge, Polygon, Chain // PolygonShape / ChainShape var vertices: FloatArray? = null var offset: Int? = null var len: Int? = null // setAsBox var hx: Float? = null var hy: Float? = null var center: Vector2? = null var angle: Int? = null // CircleShape var radius: Float? = null var position: Vector2? = null // EdgeShape var v1: Vector2? = null var v2: Vector2? = null } 

Эти свойства являются нулевыми, поскольку они считываются из JSON и могут не существовать, и поскольку некоторые поля позволяют отрицательные значения -1 не являются допустимыми значениями по умолчанию.

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

 fun scaledShapeData(data: ShapeData, scalar: Float): ShapeData { return ShapeData().apply { type = data.type vertices = data.vertices?.map { it * scalar }?.toFloatArray() offset = data.offset len = data.len hx = if(data.hx != null) data.hx * scalar else null // This is marked as an error with "None of the following functions can be called with the arguments supplied" message } } 

Точное сообщение, которое я получаю, это (изображение, так как Android Studio не позволяет мне выбирать и копировать сообщение):

сообщение об ошибке / ошибке kotlin

Я также попытался воспроизвести это на игровой площадке Котлин с помощью этого фрагмента кода:

 fun main(args: Array<String>) { var test1 : Float? = 2f val test2 : Float = 2f var test3 : Float? = if(test1 != null) test1 * test2 else null print(test3) } 

И это компилирует и выводит 4.0, как ожидалось. Насколько я вижу, два примера кода близки к идентичным.

Что именно я делаю неправильно и как я могу это исправить?

Solutions Collecting From Web of "Котлинское умножение между обнуляемыми и невалютными ошибками float даже с нулевой проверкой"

 // This is marked as an error with "None of the following functions can be called with the arguments supplied" message hx = if(data.hx != null) data.hx * scalar else null 

Разница между примером вашей игровой площадки и этим примером заключается в том, что data.hx может меняться между null проверкой и умножением.

Вместо этого вы можете использовать следующее: использование функции времени в Int :

 hx = hdata.hx?.times(scalar) 

так как * переводится во times .