在java的构造函数中获取泛型类型



是否有方法在构造函数中找到泛型类型?

 public class geneticarg {
    public static void main(String[] args) {
    a<String> a1 = new a<String>("a");
    a<String> a2 = new a<String>(null); // gives NPE
    System.out.println(a1.getClazz());
    }
}
class a<T> {
private Class<T> clazz;
private T element;
public a(T clazz) {
this.clazz = (Class<T>) clazz.getClass();
this.element = clazz;
// what if clazz is null ?
}
//getter and setter
}

EDIT:没有必要总是出现String

必须在构造函数中传递类型。您可以使用静态因子来避免必须设置两次。

A<String> a1 = A.wrap("a");
A<String> a2 = A.forClass(String.class);
class A<T> {
    private final Class<T> clazz;
    private final T element;
    private A(T t, Class<T> clazz) {
        this.clazz = clazz;
        this.element = t;
    }
    public static <T> A<T> wrap(T t) {
        return new A<T>(t, (Class) t.getClass());
    }
    public static <T> A<T> forClass(Class<T> clazz) {
        return new A<T>(null, clazz);
    }
    //getter and setter
}

在这种情况下避免类型擦除的唯一方法是使用泛型超类。你需要子类化你的泛型类型,然后你可以访问参数化类型,它可以通过反射API:

public abstract class a<T> {
    private Class<T> clazz;
    private T element;
    public a(T obj) {
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.clazz = (Class<T>) type.getActualTypeArguments()[0];
        this.element = obj;
    }
}
class StringA extends a<String> {
    public StringA(String obj) {
        super(obj);
    }
}

Peter说得很对。我想添加更多的信息:

传递给构造函数的Class<T>实例称为类型标记

相关内容

  • 没有找到相关文章

最新更新