Kotlin:如何将作为集合的类变量覆盖为子类型的集合

时间:2018-03-07 23:16:14

标签: oop kotlin

我认为标题令人困惑,所以我只会展示一些代码:

open class Polygon {
   open val vertices: List<Point>
   constructor(vertices: List<Point>) {
      this.vertices = vertices.toList()

class Face: Polygon {
   override val vertices: List<Vertex>

其中VertexPoint的子类型。

Intellij IDEA检查在Polygon的构造函数中显示此警告:

https://i.imgur.com/W2ItVRn.png

是否有更正确的方法来实现Polygon - Face层次结构,vertices在派生类Vertex中的类型列表为Face

1 个答案:

答案 0 :(得分:2)

使用泛型类型

open class Polygon {
   open val vertices: List<Point>
   constructor(vertices: List<Point>) {
      this.vertices = vertices.toList()

class Face: Polygon {
   override val vertices: List<Vertex>

您可以使Polygon具有通用参数:

open class Polygon<T: Point> {
    open val vertices: List<T>

    constructor(vertices: List<T>) {
        this.vertices = vertices.toList()
    }
}

class Face(vertices: List<Vertex>): Polygon<Vertex>(vertices)

这样您就不需要重新定义字段,从而减少重复。

使用主构造函数

您可以进一步清理这样的代码:

open class Polygon<T: Point>(val vertices: List<T>)
class Face(vertices: List<Vertex>): Polygon<Vertex>(vertices)