Kotlin和泛型,使用泛型数组实现抽象泛型类
我有以下抽象类
abstract class Vec2t<T : Number>(open var x: T, open var y: T)
由…实施
data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>(x, y)
到目前为止,一切正常
现在,我想为矩阵做类似的事情,这是我的抽象类
abstract class Mat2t<T : Number>(open var value: Array<out Vec2t<T>>)
应该由…来执行
class Mat2(override var value: Array<Vec2>) : Mat2t<Float>(value)
但编译器抱怨Array<Vec2>
:
错误:(8,32)Kotlin:“值”的类型与在main.mat.Mat2t中定义的重写的var-property“public open var value:Array>”的类型不匹配
有人告诉我:
- 我不能改变一个
var
属性的类型,当我重写它(但实际上我没有真的改变它,我重写它与一个子类型..是同样的事情?) -
mat2.value = object : Vec2t<Float>() { ... }
将无效,对于Mat2t<Float>
任何子类都不是这样的Mat2t<Float>
我怎样才能克服这些问题?
有没有办法让一个泛型类Mat2t
与一个泛型数组并实现它与一个子类型的数组?
你可以通过将泛型参数设置为Vec2t
的子类型而不是Vec2t
的泛型参数类型( T : Number
)的子类型来Vec2t
:
abstract class Mat2t<T : Vec2t<*>>(open var value: List<T>) class Mat2(override var value: List<Vec2>) : Mat2t<Vec2>(value)
请注意,因为您正在重写var value
,所以不需要在抽象类构造函数中包含它。 Vec2t
。 例如:
abstract class Vec2t<T : Number> { abstract var x: T abstract var y: T } class Vec2(override var x: Float, override var y: Float) : Vec2t<Float>() abstract class Mat2t<T : Vec2t<*>> { abstract var value: List<T> } class Mat2(override var value: List<Vec2>) : Mat2t<Vec2>()
这些抽象类甚至可以表示为接口,如果适合你:
interface Vec2t<T : Number> { var x: T var y: T } data class Vec2(override var x: Float, override var y: Float) : Vec2t<Float> interface Mat2t<T : Vec2t<*>> { var value: List<T> } data class Mat2(override var value: List<Vec2>) : Mat2t<Vec2>