Котлин, общая операция по числу

У меня есть следующее

abstract interface Vec2t<T : Number> { var x: T var y: T } 

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(ax) res.y = glm.abs(ay) return res } } 

Можно ли реализовать, допустим, abs , используя дженерики?

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

И тогда будет glm.abs() соответствующий glm.abs() на основе типа?

Вышеприведенный код терпит неудачу, поскольку он ожидает, очевидно, 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 } } 

Что позволило бы использовать в вашем контексте:

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