不同的类,列表中具有相同的超类

是否可以将具有相同超类的类放入 ArrayList 中,并且我可以检索子类的字段?


public class Animal {


  private String name; 

  public String getName() { ... }


}


public class Dog extends Animal {


  private String tailLength;

  public String getTailLength() { ... }

}


public class Bird extends Animal {


  private String beakSize;

  public String getBeakSize() { ... }


}

现在我想将它们放入 arrayList 中


private List<Animal> animals = new ArrayList<>();


animals.put(new Dog());

animals.put(new Bird());

我能够成功地将它们放入列表中,但是当我从列表中检索值时,我无法从鸟类中获取 beakSize ,从狗类中获取 tailLength 。


您能提出一个如何做到这一点的策略吗?谢谢!


POPMUISE
浏览 63回答 3
3回答

慕森卡

为什么这不起作用?你已经得到了 type 的列表Animal。这意味着编译器有且只有一个保证。该对象具有与超类关联的字段和方法Animal。自己测试一下。Animal myBird = new Bird();myBird.getBeakSize(); // This won't compile.编译器不知道它的类型,Bird因为它的引用类型是Animal。不同的方法您需要做的是重新考虑您的类设计,以便您的超类具有供您访问的必要信息。如果您需要访问特定的子类,那么我建议保留每个子类的单独列表,可能在对象内部。另一种选择可能是这样的:public abstract class Animal {&nbsp; private String name;&nbsp;&nbsp; public String getName() { ... }&nbsp; public abstract String getFaceDepth(); //}public class Bird {&nbsp; public String getFaceDepth() {&nbsp; &nbsp; &nbsp;// Return beak size here.&nbsp; }}现在,您会注意到面部深度并不是特别有用。这就是一般情况下的问题。有时,它们太笼统了,以至于失去了它们所代表的数据的本质。这可能表明您需要考虑您的类结构,具体取决于您的问题。

Helenr

当您从数组中检索元素时,可以使用 'instanceof' 方法:Animal animal = // get element/iterate over arrayif(animal instanceof Dog) {&nbsp; Dog dog = (Dog) animal;&nbsp; // continue here...}if(animal instanceof Bird) {&nbsp; Bird bird = (Bird) animal;&nbsp; // continue here...}

倚天杖

你需要有2个接口public interface Beak {&nbsp; &nbsp;String getBeakSize();}public interface Tail {&nbsp; &nbsp;String getTailSize();}现在你的代码看起来像这样public class Animal {&nbsp; private String name;&nbsp;&nbsp; public String getName() { ... }}public class Dog extends Animal implements Tail {&nbsp; private String tailLength;&nbsp; @Override&nbsp; public String getTailLength() { ... }}public class Bird extends Animal {&nbsp; private String beakSize;&nbsp; @Override&nbsp; public String getBeakSize() { ... }}您可以像以前一样添加项目。private List<Animal> animals = new ArrayList<>();animals.put(new Dog());animals.put(new Bird());但现在,您可以使用界面来查找动物是否有尾巴或喙或两者都有或什么都没有。for(Animal animal in animals) {&nbsp; &nbsp; &nbsp;if(animal instanceof Tail) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(((Tail)animal).getTailLength());&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;if(animal instanceof Beak) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(((Beak)animal).getBeakLength());&nbsp; &nbsp; &nbsp;}}为什么这很重要?这样你就可以拥有另一种动物,比如猫或另一种也有尾巴的鸟。这件作品将与他们所有人一起工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java