【问题标题】:Java List how to set and get children objects of a list of type parentJava List 如何设置和获取父类型列表的子对象
【发布时间】:2015-02-28 17:35:25
【问题描述】:

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

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

我想用不同类型的子对象(都扩展“ParentClass”)填充它们,我将如何去做。 另请注意,我不知道将使用哪个特定的子类。例如我可以尝试这样做:

list.add(someInstanceOfAChildClass);

然后能够访问该子类中的方法和属性。 如果我没有表达我的观点,我可以澄清一下。 提前致谢!

【问题讨论】:

    标签: java inheritance linked-list parent-child


    【解决方案1】:

    用不同的Child 对象填充List&lt;Parent&gt; 没有问题,但不能直接访问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();
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 那部分似乎正在工作! :) 如果我想访问父类中不存在的子类中的方法怎么办
      • 那你需要知道孩子在实现什么类。你可以有这样的代码 if (element instanceof ExpectedClass) { ExpectedClass child = (ExpectedClass) element; chil.dosomething();...}
      • 好吧,到目前为止,这是有道理的,现在如果我不知道我会得到什么孩子并且每个孩子都有一个方法 foo()
      • 如果您想避免强制转换,这是唯一的方法。如果它们从来都不是 parent 的实例,则可以将其声明为抽象的,也可以将 foo 方法声明为抽象的。如果 Parent 实例可以存在但 foo mehtod 对它们没有意义,您可以从 foo 主体 UnsuporteOperationException 中抛出,但如果您的列表将持有 Parent 对象,则异常将被抛出并且整个列表的处理将停止。
      • @BenHagel 这是正确的方法。您可以在子级继承的父级中提供默认的 foo() ,但如果他们愿意,可以覆盖。您可以安全地调用 parent.foo() 并且孩子的 foo() 将被调用(如果存在)。这就是你的多态性
      【解决方案3】:

      您在谈论多态性。如果你有:

      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 中声明。注意:这是一个很好的做法不要将属性设置为 public,除非它们是一些常量 (final)。标准方法是提供一个 getter。

      【讨论】:

        猜你喜欢
        • 2020-09-11
        • 1970-01-01
        • 2023-03-14
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多