Java:获取Generic的实例



可能重复:
使用反射在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.
}

相关内容

  • 没有找到相关文章

最新更新