我有以下内容
abstract interface Vec2t<T : Number> {
var x: T
var y: T
}
Run Code Online (Sandbox Code Playgroud)
data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>
我有一个界面,我定义了几个操作,例如:
interface fun_vector2_common {
fun abs(res: Vec2, a: Vec2): Vec2 {
res.x = glm.abs(a.x)
res.y = glm.abs(a.y)
return res
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以abs通过使用泛型来实现?
interface fun_vector2_common<T : Number> {
fun abs(res: Vec2t<T>, a: Vec2t<T>): Vec2t<T> {
res.x = glm.abs(a.x) // error
res.y = glm.abs(a.y) // error
return res
}
}
Run Code Online (Sandbox Code Playgroud)
然后glm.abs()会根据类型调用相应的?
上面的代码失败了,因为它显然期望a glm.abs(n: Number)
不幸的是,没有通用abs功能的干净方法.您可以使用以下abs定义来解决它:
object glm {
fun <T : Number> 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
}
}
Run Code Online (Sandbox Code Playgroud)
哪个可以在您的上下文中使用:
fun abs(res: Vec2, a: Vec2): Vec2 {
res.x = glm.abs(a.x)
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |