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());
}
}
为什么这很重要?这样你就可以拥有另一种动物,比如猫或另一种也有尾巴的鸟。这件作品将与他们所有人一起工作。
添加回答
举报