亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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條經驗 獲得超4個贊

當您從數組中檢索元素時,可以使用 '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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號