可能重复:
get type of a generic parameter in java with reflection
您好我在这里阅读了有关获取泛型类型实例的解决方案。我认为我的问题有点不同,所以我为了简单而将其分解。 让我们假设我有三个类:
public class Car (){
public int velocity;
public String name;
public Car(int velocity, String name){
this.velocity = velocity;
this.name = name;
}
}
public class ColoredCar extends Car(){
public String color;
//setters and getters for color, same Constructor....
}
public class DrivenCar extends ColoredCar(){
public Driver driver;
//setters and getters, same Constructor
}
现在我扩展了ArrayList,如:
public class Cars<CAR extends Car> extends ArrayList<CAR>{
public String[] getColors(){
String[] ret = new String[this.size()];
int count = 0;
for(CAR c: this){
ret[count++] = c.getColor();
}
return ret;
}
//some more.....
}
好的,如果我需要创建一个扩展Cars
的类,并且在其构造函数中我知道它们已经是CAR
的10个对象,我有什么可能性?我知道我可以创建具有速度和名称的Car Objects,我有。
编辑: 让我说我的汽车有一个功能:
public CAR createCar(int velocity, String name){
return (CAR)new Car(velocity, name);
}
并且在Runtime Cars定义为Cars,我是否收到错误,因为我无法将汽车投入到DrivenCar中?
答案 0 :(得分:1)
如果您询问如何在运行时构造对象T,则始终可以传入T.class,然后使用其newInstance()方法创建该类型的对象。如果您询问如何使用T对象列表初始化容器类,那么......
您可以定义一个构造函数,该构造函数使用super
来调用父构造函数并传入项目(首先转换为集合),或者您可以定义自己的构造函数,只需调用add
添加你的十辆车的方法。但是,这是对继承模式的严重滥用。
继承不是代码重用。它用于变化(即,同一接口的多个不同的可能实现)。对于代码重用,包含几乎总是一个更好的范例。即:
class Cars<CAR> {
private List<CAR> cars = new ArrayList<CAR>();
// ...
public Iterable<String> getColors() {
return Iterables.transform(cars, getCarToColorTransform());
}
// Expose other methods of List<CAR>, but ONLY the ones you need.
}