在Java中的字段中存储类泛型

时间:2009-05-26 16:06:02

标签: java generics

有没有办法将构造中传递的泛型参数类型存储到参数中。我的目标:

class generic<T> {
    Class<T> type;
    public generic() {
        super();
        this.type = //Something that gets class from T
    }
}

我目前正在做的是:

class generic<T> {
    Class<T> type;
    public generic(Class<T> type) {
        super();
        this.type = type;
    }
}

两次指定课程似乎很愚蠢,但我不确定如何做到这一点。我认为这可能是通过反思实现的,但我还没有调查过。有更简单的方法吗?如果不是(作为旁白)为什么信息丢失?

4 个答案:

答案 0 :(得分:10)

因为Java泛型是使用Type Erasure

实现的
  

实例化泛型类型时,   编译器通过转换这些类型   一种称为类型擦除的技术 - a   编译器删除所有的进程   与类型参数相关的信息   并在类或中键入参数   方法。类型擦除启用Java   使用泛型的应用程序   保持二进制兼容性   Java库和应用程序   是在仿制药之前创建的。

答案 1 :(得分:8)

如果使用带有类型推断的静态创建方法而不是构造函数,则不需要指定类型两次。

final class Generic<T> {
    private final Class<T> type;
    private Generic(Class<T> type) {
        super();
        if (type == null) {
            throw new NullPointerException();
        }
        this.type = type;
    }
    public static <T> Generic<T> newInstance(Class<T> clazz) {
        return new Generic<T>(clazz);
    }
}
...
    someFunction(Generic.newInstance(SomeType.class));

当然,如果你想将结果存储在一个变量中,你可能会重复这个类型!

答案 2 :(得分:3)

我认为你不能因为type erasure而这样做。

答案 3 :(得分:3)

它们的类型在运行时不会保留,因此您不能将其作为参数。 java中的泛型是严格的编译时概念(出于向后兼容性原因)。这称为Type Erasure

类对象获取类型参数的原因之一正是解决此问题,因此您可以使用类对象以编程方式表示类型。