【问题标题】:Java: get instance of Generic [duplicate]Java:获取通用实例
【发布时间】: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&lt;CAR&gt;ArrayList&lt;Car&gt; 不同。 ArrayList&lt;CAR&gt; 只能保存对象,所有相同类型,它们都是Car 的某些特定 子类。 ArrayList&lt;Car&gt; 可以保存属于Car 子类的任何类型的对象。所以在Cars 类上使用getColors() 方法没有意义,因为如果我有Cars&lt;DrivenCar&gt; 的实例,那么它不能 包含任何ColoredCar 实例。

标签: java generics reflection instance


【解决方案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.
}

【讨论】:

  • 看起来像一个适配器模式。这正是我对 Cars 所做的,但为了方便起见,我将其发布在这里,就像我继承了 ArrayList 一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多