Java:获取Generic的实例

时间:2011-09-13 00:06:41

标签: java generics reflection instance

  

可能重复:
  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中?

1 个答案:

答案 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.
}