Kotlin,通用添加
是否可以实现一个通用的,比如说,像下面这样:
public abstract interface NumberEx { abstract fun plus(other: NumberEx): NumberEx } abstract interface Vec2t<T : NumberEx> { open var x: T open var y: T fun add(res: Vec2t<T>, a: Vec2t<T>, bX: T, bY: T): Vec2t<T> { res.x = ax + bX res.y = ay + bY return res } }
因为这里编译器抱怨ax + bX
和ay + bY
:
类型不匹配。 要求:T找到:NumberEx
一种方法是采用递归的NumberEx
定义,如下所示:
interface NumberEx<T : NumberEx<T>> { operator fun plus(other: T): T }
这将需要一个实现提供一个加号运算符:
class ANumber : NumberEx<ANumber> { override fun plus(other: ANumber): ANumber { //TODO } }
并且会使编译器在Vec2t
使用它的类型安全和可以理解
interface Vec2t<T : NumberEx<T>> { ... }