Kotlin,Number的通用操作

我有以下

abstract interface Vec2t { var x: T var y: T } 

data class Vec2(override var x: Float, override var y: Float) : Vec2t

我有一个界面,我定义了几个操作,例如:

 interface fun_vector2_common { fun abs(res: Vec2, a: Vec2): Vec2 { res.x = glm.abs(ax) res.y = glm.abs(ay) return res } } 

使用generics可以实现,比如abs吗?

 interface fun_vector2_common { fun abs(res: Vec2t, a: Vec2t): Vec2t { res.x = glm.abs(ax) // error res.y = glm.abs(ay) // error return res } } 

然后基于types的相应的glm.abs()将被调用?

上面的代码失败,因为它显然,期望glm.abs(n: Number)

不幸的是,没有一个干净的方法来使用genericsabs函数 。 你可以用下面的abs定义来处理它:

 object glm { fun  abs(x: T): T { val absoluteValue: Number = when (x) { is Double -> Math.abs(x) is Int -> Math.abs(x) is Float -> Math.abs(x) is BigDecimal -> x.abs() is BigInteger -> x.abs() else -> throw IllegalArgumentException("unsupported type ${x.javaClass}") } @Suppress("UNCHECKED_CAST") return absoluteValue as T } } 

这将使您可以在您的情况下使用:

 fun abs(res: Vec2, a: Vec2): Vec2 { res.x = glm.abs(ax) ... }