为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-10-12 16:41:21
是否可以将具有相同超类的类放入 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 。您能提出一个如何做到这一点的策略吗?谢谢!
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

为什么这不起作用?

你已经得到了 type 的列表Animal。这意味着编译器有且只有一个保证。该对象具有与超类关联的字段和方法Animal。自己测试一下。


Animal myBird = new Bird();


myBird.getBeakSize(); // This won't compile.

编译器不知道它的类型,Bird因为它的引用类型是Animal。


不同的方法

您需要做的是重新考虑您的类设计,以便您的超类具有供您访问的必要信息。


如果您需要访问特定的子类,那么我建议保留每个子类的单独列表,可能在对象内部。


另一种选择可能是这样的:


public abstract class Animal {


  private String name; 

  public String getName() { ... }

  public abstract String getFaceDepth(); //


}


public class Bird {

  public String getFaceDepth() {

     // Return beak size here.

  }

}


现在,您会注意到面部深度并不是特别有用。这就是一般情况下的问题。有时,它们太笼统了,以至于失去了它们所代表的数据的本质。这可能表明您需要考虑您的类结构,具体取决于您的问题。


查看完整回答
反对 回复 2023-10-12
?
Helenr

TA贡献1780条经验 获得超3个赞

当您从数组中检索元素时,可以使用 'instanceof' 方法:


Animal animal = // get element/iterate over array

if(animal instanceof Dog) {

  Dog dog = (Dog) animal;

  // continue here...

}

if(animal instanceof Bird) {

  Bird bird = (Bird) animal;

  // continue here...

}


查看完整回答
反对 回复 2023-10-12
?
倚天杖

TA贡献1828条经验 获得超3个赞

你需要有2个接口


public interface Beak {

   String getBeakSize();

}


public interface Tail {

   String getTailSize();

}

现在你的代码看起来像这样


public class Animal {


  private String name; 

  public String getName() { ... }


}


public class Dog extends Animal implements Tail {

  private String tailLength;


  @Override

  public String getTailLength() { ... }

}


public class Bird extends Animal {

  private String beakSize;


  @Override

  public String getBeakSize() { ... }


}

您可以像以前一样添加项目。


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


animals.put(new Dog());

animals.put(new Bird());

但现在,您可以使用界面来查找动物是否有尾巴或喙或两者都有或什么都没有。


for(Animal animal in animals) {

     if(animal instanceof Tail) {

          System.out.println(((Tail)animal).getTailLength());

     }

     if(animal instanceof Beak) {

          System.out.println(((Beak)animal).getBeakLength());

     }

}

为什么这很重要?这样你就可以拥有另一种动物,比如猫或另一种也有尾巴的鸟。这件作品将与他们所有人一起工作。


查看完整回答
反对 回复 2023-10-12
  • 3 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信