【发布时间】:2011-09-13 00:06:41
【问题描述】:
可能重复:
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 个对象,我有什么可能性?我知道我可以创建具有速度和名称的汽车对象,我有。
编辑: 假设我的汽车中有一个功能:
public CAR createCar(int velocity, String name){
return (CAR)new Car(velocity, name);
}
并且在运行时 Cars 被定义为 Cars,我是否会收到错误,因为我无法将 Car 转换为 DrivenCar?
【问题讨论】:
-
创建作为泛型传递的 CAR 类型的对象
-
在这种情况下,您的问题与所有有关执行
new T(或等效项)的问题相同,其中T是通用参数。答案是:你不能。 (至少,不是没有T的实例。) -
当我将汽车投射到 CAR 时是否有问题,即使在运行时 CAR 是 DrivenCar?
-
请编辑您的问题以包含您的意思的代码示例。
-
@Rafael:请记住,
ArrayList<CAR>与ArrayList<Car>不同。ArrayList<CAR>只能保存对象,所有相同类型,它们都是Car的某些特定 子类。ArrayList<Car>可以保存属于Car子类的任何类型的对象。所以在Cars类上使用getColors()方法没有意义,因为如果我有Cars<DrivenCar>的实例,那么它不能 包含任何ColoredCar实例。
标签: java generics reflection instance