【发布时间】:2012-08-05 18:46:41
【问题描述】:
是否可以在单个容器中存储从同一个抽象对象扩展而来的不同对象,并能够访问这些对象的所有自定义字段。让我举一个例子: 假设我有两辆车:福特和本田。由于所有汽车都有重量和颜色,我可以创建以下抽象类:
public abstract class Car{
private double weight;
private String color;
public Car(){
this.weight=0;
this.color="";
}
...getters and
...setters
}
现在假设我的 Ford 类有一个附加字段“radio”,如下所示:
public Ford extends Car(){
private String radio;
public Ford(){
super();
this.radio = "generic";
}
}
同样,Honda 类也有一个自定义字段 'camera'
public Honda extends Car(){
private String camera;
public Honda(){
super();
this.camera= "analog";
}
}
是否可以将这些类的实例保存在单个容器中,如下所示。请注意下面的代码有效,但这不是我想要的。请参阅下面的 cmets:
Ford ford = new Ford();
Honda honda = new Honda();
ArrayList<Car> myCars = new ArrayList<Car>();
myCars.add(ford);
myCars.add(honda);
这是我的问题:
当我做myCars.get(0) 时,我得到了一个Car 类的对象(显然)并且我永远无法获得自定义字段radio。当然,我可以执行((Ford) myCars.get(0)) 之类的操作,并且能够看到 radio 字段,但是是否可以创建一个更好的容器来显示所有字段而无需向下转换等,例如:
myContainer.get(0) - 将返回 Ford 类,我将可以访问重量、颜色和 radio
myContainer.get(1) - 将返回 Honda 类,我将可以访问重量、颜色和 相机。
我的预感告诉我,解决方案就在附近,而且是可能的,但我在 Java 方面的专业知识还没有达到。也许我必须对某种泛型或哈希图做些什么?
谢谢你们!!
【问题讨论】:
-
参考 Joshua Bloch 的 Effective Java,第 29 条:类型安全的异构容器。
-
谢谢,我会调查的!!目前我对异构容器知之甚少。谢谢领导!!
标签: java inheritance casting polymorphism abstract-class