首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多态性初始化对象列表

使用多态性初始化对象列表
EN

Stack Overflow用户
提问于 2015-04-27 08:17:35
回答 3查看 2.3K关注 0票数 7

我有一个关于应用多态性的问题:假设我有一个类Bird,并且我有很多类来扩展它(比如PigeonFalcon等等)。接下来,我有一个Cage类。在这节课上,我想列一张住在那个笼子里的鸟的清单(每个笼子里只能有一种鸟)。

正因为如此,我不知道列表的扩展类型(A Pigeon?或者是Eagle?),我唯一知道的就是它将是一个Bird

Pigeon extends Bird If

使用多态性,我可以将鸟声明为:Bird tom = new Pigeon();而不是Pigeon tom = new Pigeon();

所以为什么我不能在构造函数中初始化这样的东西:.

代码语言:javascript
复制
private List<Bird> birdList;

    public Cage() {
        this.birdList = new ArrayList<Pigeon>();
        /* Instead of birdList = new ArrayList<Bird>(); */
    }

如果你不能做到这一点,是否有可能以另一种方式实现我的目标?

EN

回答 3

Stack Overflow用户

发布于 2015-04-27 08:25:26

因为在每个笼子里只有一种鸟,所以你可以使用通用类型来键入你的笼子类。

例如,Cage<T>将以这样的方式定义一个鸟类列表:List<T> birdList

票数 2
EN

Stack Overflow用户

发布于 2015-04-27 08:30:04

你不能这样做:

列表鸟类=新的ArrayList();

在爪哇。左边的通用类型必须是完全相等的(或者不一定是相等的,如果在游戏中有牌??)扩展T还是?超级T)右边的泛型类型。

如果有可能的话,那就不可能把新鹰加入到被宣布为鸟类名单的名单中--这是没有意义的。

你能做的是:

代码语言:javascript
复制
List<Bird> birds = new ArrayList<Bird>();
birds.add(new Pigeon());

(Bird的所有家族,包括Pigeon的)

或者:

代码语言:javascript
复制
List<? extends Bird> birds = new ArrayList<Pigeon>();
birds.add(new Pigeon()); // Adding is immpossible now - list can be read only now! 
票数 1
EN

Stack Overflow用户

发布于 2015-04-27 08:22:06

您可以添加到您的鸟阵列鸽子,然后测试的实例:

代码语言:javascript
复制
private List<Bird> birdList;

public Cage(){
    this.birdList = new ArrayList<>();
    birdList.add(new Pidgeon());

    //...
    //Checking if it is a Pidgeon :
    if(birdList.get(i) instanceof Pidgeon) {

        //It is a pidgeon

    }
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29890562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档