Kotlin在可空和不可空的浮动错误之间进行乘法运算,即使是空检查也是如此

我从Java中移植了一个名为ShapeData的类,该类填充了可为空的类型。 它看起来像这样:

 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警告/错误消息

我也试着用这段代码在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。 据我所见,两个代码样本几乎相同。

我究竟做错了什么,我该如何解决这个问题?

 // 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上的times函数:

 hx = hdata.hx?.times(scalar) 

因为*被翻译成times