使用多态初始化对象列表

Tha*_*iar 7 java polymorphism list

我有一个关于应用多态的问题:让我们假设我有一个类Bird,并且我有许多扩展它的类(比如Pigeon,Falcon依此类推).接下来,我有一Cage堂课.在这堂课中,我想列出一个生活在笼子里的鸟类(只有一种鸟可以生活在每个笼子里).

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

如果 Pigeon extends Bird

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

那么为什么我不能在构造函数中初始化类似的东西:[...]

private List<Bird> birdList;

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

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

Arn*_*sch 8

您可能想要的是为您的Cage使用通用类型来捕获中生活的鸟类.像这样:

import java.util.ArrayList;
import java.util.List;

public class Cage<T extends Bird> {

    private List<T> birdList;

    public Cage() {
        birdList = new ArrayList<T>();
    }

    public void addBird(T bird) {
        birdList.add(bird);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你会像这样使用笼子:

Cage<Eagle> eagleCage = new Cage<Eagle>();
eagleCage.addBird(new Eagle());
Run Code Online (Sandbox Code Playgroud)