Java 使用多态性初始化对象列表
关于应用多态性,我有一个问题:假设我有一个类Java 使用多态性初始化对象列表,java,list,polymorphism,Java,List,Polymorphism,关于应用多态性,我有一个问题:假设我有一个类Bird,我有许多类扩展它(比如bige,Falcon等等)。 接下来,我有一个Cage类。在这节课上,我想列一张生活在那个笼子里的鸟的名单(每个笼子里只能生活一种鸟) 因此,我不知道列表的扩展类型(鸽子或鹰),我只知道它将是一只鸟 如果鸽子延伸鸟 使用多态性,我可以将一只鸟声明为: Bird tom=新鸽子()而不是鸽子汤姆=新鸽子() 那么为什么我不能在构造函数中初始化类似的内容: [……] 私人鸟类名录; 公共笼子(){ this.birdLis
Bird
,我有许多类扩展它(比如bige
,Falcon
等等)。
接下来,我有一个Cage
类。在这节课上,我想列一张生活在那个笼子里的鸟的名单(每个笼子里只能生活一种鸟)
因此,我不知道列表的扩展类型(鸽子或鹰),我只知道它将是一只鸟
如果鸽子延伸鸟
使用多态性,我可以将一只鸟声明为:
Bird tom=新鸽子()代码>而不是鸽子汤姆=新鸽子()代码>
那么为什么我不能在构造函数中初始化类似的内容:
[……]
私人鸟类名录;
公共笼子(){
this.birdList=新的ArrayList();
/*而不是birdList=newarraylist()*/
}
如果你不能做到这一点,是否有可能以另一种方式实现我的目标 您可以添加到bird arraylist pidgeon,然后测试以下实例:
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
}
}
私人鸟类名录;
公共笼子(){
this.birdList=新的ArrayList();
添加(新的Pidgeon());
//...
//检查是否为皮江:
if(birdList.get(i)Pidgeon实例){
//这是一只皮江
}
}
因为每个笼子里只生活着一种鸟,所以可以使用泛型类型来键入笼子类
例如,Cage
将以这种方式定义鸟类列表:list birdList
您不能执行以下操作:
List birds=new ArrayList()
在java中。左侧的泛型类型必须与右侧的泛型类型完全相等(或者,如果游戏中有通配符-?扩展T或?超级T,则可能不必相等)
若有可能的话,那个么就不可能将新的老鹰添加到被宣布为鸟类名单的名单中——这毫无意义
您可以做的是:
List<Bird> birds = new ArrayList<Bird>();
birds.add(new Pigeon());
你可能想要的是在你的笼子里使用一种通用类型来捕捉生活在笼子里的确切种类的鸟。像这样:
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);
}
}
import java.util.ArrayList;
导入java.util.List;
公营笼{
私人名单鸟类名录;
公共笼子(){
birdList=newarraylist();
}
公共空间的鸟(T鸟){
添加(鸟);
}
}
然后,您可以像这样使用框架:
Cage<Eagle> eagleCage = new Cage<Eagle>();
eagleCage.addBird(new Eagle());
class Bird {}
class Pidgeon extends Bird {}
class Cage {
// This is a wildcard type and can contain lists of any
// subtype to Bird, but you can't add elements to it.
private List<? extends Bird> birdList;
public Cage() {
this.birdList = new ArrayList<Pidgeon>();
}
}
Cage-eagleage=new-Cage();
addBird(neweagle());
您不能执行List birdList=new ArrayList()
的原因是,有人可以使用birdList
引用将任何Bird
子类写入您的ArrayList
。类型检查器不允许这样做,一个Pidgin
列表只能包含Pidgin
实例
Arne使用Cage
上的类型参数给出了一个解决方案。如果这不是你想要做的,你可以用一个
您的示例如下所示:
Cage<Eagle> eagleCage = new Cage<Eagle>();
eagleCage.addBird(new Eagle());
class Bird {}
class Pidgeon extends Bird {}
class Cage {
// This is a wildcard type and can contain lists of any
// subtype to Bird, but you can't add elements to it.
private List<? extends Bird> birdList;
public Cage() {
this.birdList = new ArrayList<Pidgeon>();
}
}
classbird{}
类Pidgeon扩展了Bird{}
类笼{
//这是一种通配符类型,可以包含任何
//子类型,但不能向其中添加元素。
private Listshort answer,因为它们不是同一类型。阅读此线程多态性的全部要点是不要按照您建议的方式在运行时执行类型检查。查看yvilbe的答案,以获得更好的解决方案。