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

DPM

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

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

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

Vertex的子类型在哪里Point

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

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

是否有实现一个比较正确的做法Polygon-Face用层次vertices是类型列表的Vertex派生类Face

Jrtapsell

使用通用类型

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#覆盖基类集合类型

如果我有超类类型的集合,如何获得特定子类类型的所有项?

如何将作为字典的变量传递给Ansible Role?

如何覆盖子类中的类变量?

广告子类型的XStream集合

Kotlin:如何将集合传递给函数的泛型类型

如何将集合(arrayList,vector等)写为UML(类图)中的属性?

将子类型的集合转换为超类型的集合

如何将类型抽象类的变量强制转换为其子类?

如何将不同类型的子元素反序列化为基本类型的列表/集合,该列表/集合是相应类的属性

如何将返回类型注释为类实例或其(唯一)子类实例?

如何将作为函数的变量值传递给调用

如何将作为列表的foreach的结果存储到变量中并在弹出窗口中显示

如何将 Firebase 集合的每个文档制作为 ListTile?

如何将动态集合作为流处理?

如何将KeyValuePair集合作为JSON数组访问

C# 如何将可选参数作为集合传递?

如何删除集合类型?

如何将作为列表的熊猫列值分解为单独的功能

如何使用超类的实例访问子类的覆盖变量

在继承的类的集合中丢失子类的属性

类型参数为Inherit的泛型类的协变量是子类

如何将验证应用于集合类型的元素

使用LINQ,如何将集合聚合为指定的类型?

Java-如何将类型集合转换为ArrayList?

如何将类型集合从clojure传递给Java?

Java中的异步Lambda如何将作用域定义为局部变量

Laravel - 如何将集合复制到新变量

cmake:如何将变量列表(从集合)传递给代码