有没有办法将构造中传递的泛型参数类型存储到参数中。我的目标:
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;
}
}
两次指定课程似乎很愚蠢,但我不确定如何做到这一点。我认为这可能是通过反思实现的,但我还没有调查过。有更简单的方法吗?如果不是(作为旁白)为什么信息丢失?
答案 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。
类对象获取类型参数的原因之一正是解决此问题,因此您可以使用类对象以编程方式表示类型。