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.
}
}
現在,您會注意到面部深度并不是特別有用。這就是一般情況下的問題。有時,它們太籠統了,以至于失去了它們所代表的數據的本質。這可能表明您需要考慮您的類結構,具體取決于您的問題。

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...
}

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());
}
}
為什么這很重要?這樣你就可以擁有另一種動物,比如貓或另一種也有尾巴的鳥。這件作品將與他們所有人一起工作。
添加回答
舉報