Java 只需在列表中添加父类对象并限制子类对象

Java 只需在列表中添加父类对象并限制子类对象,java,Java,我需要声明一个列表,它应该只接受父类对象,而不允许子类对象 parent class: public class ParentClass { private String parentAttr; public String getParentAttr() { return parentAttr; } public void setParentAttr(String parentAttr) { this.parentAttr = parentAttr;

我需要声明一个列表,它应该只接受父类对象,而不允许子类对象

parent class:

public class ParentClass {

  private String parentAttr;

  public String getParentAttr() {
    return parentAttr;
  }

  public void setParentAttr(String parentAttr) {
    this.parentAttr = parentAttr;
  }

}


Sub class:

public class SubClass1 extends ParentClass {

  private String attr1;

  public String getAttr1() {
    return attr1;
  }

  public void setAttr1(String attr1) {
    this.attr1 = attr1;
  }

}

Main class:

public class MainClass {

  public static void main(String[] args) {
    ParentClass parentClass=new ParentClass();

    SubClass1 subClass1 = new SubClass1();

    List<ParentClass> list=new ArrayList<ParentClass>(); // modify this declaration such that it should accept only the parent class objs

    list.add(parentClass);

    list.add(subClass1); // this should not happen. only parent class objects should be added in the list

  }

}
父类:
公共类父类{
私有字符串parentAttr;
公共字符串getParentAttr(){
返回parentAttr;
}
public void setParentAttr(字符串parentAttr){
this.parentAttr=parentAttr;
}
}
子类:
公共类子类1扩展了父类{
私有字符串attr1;
公共字符串getAttr1(){
返回属性1;
}
公共void setAttr1(字符串attr1){
this.attr1=attr1;
}
}
主要类别:
公共类主类{
公共静态void main(字符串[]args){
ParentClass ParentClass=新的ParentClass();
子类1子类1=新的子类1();
List List=new ArrayList();//修改此声明,使其仅接受父类objs
list.add(父类);
list.add(subclass 1);//不应发生这种情况。只应在列表中添加父类对象
}
}

我也尝试过使用泛型。但它不起作用。在java泛型中有什么方法可以实现这一点吗?

没有。你无法阻止它。我们可以把每个孩子都当作父母。每个孩子都是父母的延伸,很明显,他们也是父母

您可以实现接口并为方法提供自己的实现,并检查元素在实现中是否是父类的实例而不是子类的实例


您还可以扩展该类并重写将元素添加到ArrayList的所有方法,并检查该元素在实现中是否为父类的实例而不是子类的实例,并调用超级方法以执行添加元素的过程.

不幸的是
子类1
是一个
父类
,因为它扩展了
父类
类:我能想到的唯一可能的解决方案是将类声明为不可扩展的不可变类。否则,单凭列表的标准实现是无法做到这一点的。你真的想知道为什么要这样做。为什么一个集合会关心这个问题?@Shahzeb。这是一次采访中提出的问题。所以我问我,这是一次采访中提出的问题。所以我试过了it@pradeep受访者可能希望得到这样的答案:
每个孩子都是父母,所以我们不能
列表=新的ArrayList();//修改此声明,使其仅接受父类objs
OP,此处没有机会实现新列表。:)他可以扩展ArrayList类,我认为这是最简单、最安全的方法。