duk*_*vin 0 java arrays polymorphism arraylist
如果我在运行时填充了一系列Birds,那么如何访问特定于子类的成员方法?
class Bird
{
public Bird() {}
public void fly(int x) {
System.out.println("Flew "+x+" meters");
}
}
class DumbBird extends Bird
{
public DumbBird() {super();}
public void fly(int x) {
x-=5; //we're dumb
System.out.println("Flew "+x+" meters");
}
public void sing() {
System.out.println("La la la!");
}
}
public static void main(String[] args)
{
Bird[] cage = new Bird[10];
cage[0] = new Bird();
cage[1] = new Dumbbird();
cage[2] = new Sleepybird();
//.... more bird types
cage[1].sing(); //is inaccessable because it is of type Bird not DumbBird!
}
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法能够拥有一个泛型类型数组,同时能够访问特定于子类的成员函数?我想不必编辑Bird类.
从理论上讲,是的.放入数组的项目是可以恢复的,因此您可以确定要查看的类型,并将特定对象强制转换为实际类型.但这不是一个非常干净的解决方案,所以我不推荐它.
您可以考虑使用一个抽象类或接口来代表鸟,它具有大多数鸟类会支持的方法,以及检查方法canSing()或canFly().UnsupportedOperationException如果你试图调用鸟不支持的方法,那些不支持此类的鸟类如不会飞的鸟类可以扔掉它,但是没有简单的方法来一般地引用所有的鸟类,并且知道每种方法的所有不同方法子类型的鸟可以有.
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |