可能重复:
使用反射在java中获取通用参数的类型
嗨,我在这里读到了关于获取泛型类型实例的解决方案。我觉得我的问题有点不同,所以我把它分解为简单的问题。假设我有三个类:
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个对象,我有什么可能性?我知道我可以创建有速度和名称的汽车对象,我已经有了。
编辑:比方说,我的汽车中有一个功能:
public CAR createCar(int velocity, String name){
return (CAR)new Car(velocity, name);
}
在Runtime Cars被定义为Cars时,我会因为不能将Car转换为DrivenCar而出错吗?
如果您询问如何在运行时构造对象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.
}