Kotlin:在基类中构造派生泛型类型的值

我试图通过定义运算符来减少一些向量类型的重复,但是我不确定这是否可能。 这似乎是最有希望的方法:

open class VecN<Derived: VecN<Derived>>(val buffer: FloatArray) { operator fun minus(other: Derived) = Derived(buffer.zip(other.buffer, { a, b -> a - b }).toFloatArray()) operator fun plus(other: Derived) = Derived(buffer.zip(other.buffer, { a, b -> a + b }).toFloatArray()) ... many more operators... } class Vec2(x: Float, y: Float) : VecN<Vec2>(floatArrayOf(x, y)) class Vec3(x: Float, y: Float, z: Float) : VecN<Vec3>(floatArrayOf(x, y, z)) class Vec4(x: Float, y: Float, z: Float, w: Float) : VecN<Vec4>(floatArrayOf(x, y, z, w)) 

这给了我“类型参数派生不能被称为函数”,我尝试构建我的派生返回值。

在Kotlin中可以做到这一点吗?

你不能以直接的方式做到这一点,因为在Kotlin中,你只能调用具体类型的构造函数,所以没有办法调用类型参数的构造函数。 此外,Kotlin不允许将数组传递给需要固定数量的单独值的函数/构造函数。

但是,您可以尝试使用抽象函数来实现这一点,而不需要太多样板文件,如下所示:

 abstract class VecN<Derived: VecN<Derived>>(val buffer: FloatArray) { protected abstract fun createNew(buffer: FloatArray): Derived operator fun minus(other: Derived) = createNew(buffer.zip(other.buffer, Float::minus).toFloatArray()) // ... } 

那么你必须在每个派生类中重写这个函数:

 class Vec2(x: Float, y: Float) : VecN<Vec2>(floatArrayOf(x, y)) { override protected fun createNew(buffer: FloatArray) = Vec2(buffer[0], buffer[1]) } 

(这个代码的演示)