首页 文章

Java列表如何设置和获取父类型列表的子对象

提问于
浏览
5

如果我有一个父对象的链接列表,如:

LinkedList<ParentClass> list = new LinkedList<ParentClass>();

我想用不同类型的子对象(所有扩展为“ParentClass”)来填充它们,我将如何进行此操作 . 另请注意,我不知道将使用哪个特定的子类 . 例如,我可以尝试:

list.add(someInstanceOfAChildClass);

然后能够访问该子类中的方法和属性 . 如果我没有明白我的意思,我可以澄清一下 . 提前致谢!

3 回答

  • 5

    使用不同的 Child 对象填充 List<Parent> 没有问题,但是您无法直接访问 Child 的方法和属性 . 如果您尝试将 List 成员分配给类型为 Child 的引用,则会出现类型不匹配错误 .

    要解决此问题,您可以显式键入强制转换 List 返回的对象 .

    Child iThinkItsChild = (Child) listOfParents.get(indexOfChild);
    

    但是,要安全地执行此操作,首先应使用 instanceof 运算符 .

    Parent parent = listOfParents.get(indexOfChild);
    if (parent instanceof Child) {
        Child imSureItsChildNow = (Child) parent;
        imSureItsChildNow.childMethod();
    }
    
  • 1

    您只需添加子类元素 . 当它们扩展ParentClass时,它们可以添加到任何包含ParentClass类型的集合中 .

  • 0

    你在谈论多态性 . 如果你有 :

    public class A extends ParentClass {...}
    public class B extends ParentClass {...}
    

    您只需要将 AB 的实例添加到列表中,例如

    list.add(new A()); // add a A
    list.add(new A()); // add another A
    list.add(new B()); // add a B
    

    然后,如果你想对列表的所有元素做一些事情,例如

    for (ParentClass foo : list) {
       foo.doSomething();
    }
    

    方法 doSomething() 需要使用实现定义,或在 ParentClass 中声明 abstract ,并且可以在 AB 中重写以反映每个类中的特定行为 . 如果您需要访问某些属性,则需要 public 并在 ParentClass 中声明 . 注意:这是一个好习惯 not to 将属性设置为 public ,除非它们是一些常量( final ) . 标准方法是提供一个吸气剂 .

相关问题