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

Dav*_*ger 9 java generics

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

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

我目前正在做的是:

class generic<T> {
    Class<T> type;
    public generic(Class<T> type) {
        super();
        this.type = type;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

bru*_*nde 10

因为Java泛型是使用Type Erasure实现的

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


Tom*_*ine 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));
Run Code Online (Sandbox Code Playgroud)

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