gpt4 book ai didi

java - 创建父类(super class)数组,同时维护多态属性

转载 作者:行者123 更新时间:2023-12-01 07:57:07 24 4
gpt4 key购买 nike

如果我有一个在运行时填充的 Bird 数组,我如何访问特定于子类的成员方法?

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

有没有一种好方法可以拥有一组泛型类型,同时能够访问特定于子类的成员函数?我不想编辑 Bird 类。

最佳答案

理论上是的。放入数组中的项目是可具体化的,因此您可以确定正在查看的类型并将特定对象转换为其实际类型。不过,这不是一个非常干净的解决方案,因此我不推荐它。

您可以考虑使用一个代表鸟类的抽象类或接口(interface),其中包含大多数鸟类都支持的方法,以及检查方法 canSing()canFly( )。如果您尝试调用鸟类不支持的方法,不支持此功能的鸟类(例如不会飞的鸟类)可能会抛出 UnsupportedOperationException ,但没有简单的方法来通用引用所有鸟类和了解每种鸟类可以拥有的所有不同方法。

关于java - 创建父类(super class)数组,同时维护多态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28659093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com