简体   繁体   English

扩展包含对自身列表的引用的类

[英]Extending a class which contains reference to List of itself

I have a super class something like 我有一个超级班级

class SuperClass {
   private String name;
   private List<SuperClass> subList;
   //getter setters
}

And I want to extend this SuperClass to have few more field, something like 我想将此SuperClass扩展为具有更多字段,例如

class SubClass extends SuperClass {
    private String email;
   //getter setter
}

Now, my question is since the SuperClass holds a reference to a list of objects of type SuperClass, how will I ensure that any SubClass object holds a reference to a list of object of type SubClass... is it even possible? 现在,我的问题是,由于SuperClass拥有对SuperClass类型的对象列表的引用,我如何确保任何SubClass对象都拥有对SubClass类型的对象列表的引用...甚至有可能吗? Am I doing something terribly wrong here? 我在这里做错什么吗?

EDIT Can I do something like 编辑我可以做点什么

class SuperClass {
private String name;
private List<? extends SuperClass> subList;
public SuperClass(List<? extends SuperClass> subList) {
    this.subList = subList;
  }
}

And now SubClass just needs to call the constructor of super class 现在SubClass只需调用超类的构造函数

class SubClass extends SuperClass{
    private String email;

    private SubClass(List<? extends SuperClass> subList) {
        super(subList);
      }
    }

But Now if i want to add something to the list, I would not be able to because PECS (producer-extends, consumer-super) principle of generics doesn't allow me to do that.. So whenever, i'll have to add an object to subList I will have to create a new list and then set the list in SubClass 但是现在,如果我想在列表中添加一些内容,我将无法执行,因为泛型的PECS(生产者扩展,超级消费者)原则不允许我这样做。因此,无论何时,我都必须将一个对象添加到subList我将不得不创建一个新列表,然后在SubClass中设置该列表

Would it be possible to introduce a third class? 可以引入第三类吗? Something along those lines: 遵循这些原则:

class AbstractClass<T> {
    protected List<T> subList;
    // getter setters
}

class SuperClass extends AbstractClass<SuperClass> {
    private String name;
    // getter setters
}

class SubClass extends AbstractClass<SubClass> {
    private String email;
    // getter setter
}

If you want to maintain that hierarchy, I would write something like this: 如果您想维护该层次结构,我将编写如下内容:

class SubClass extends SuperClass{
    ....
    public addItemToSublist(SuperClass item){
        if(item instanceof SubClass){
            subList.add(item);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM