1

コンストラクターでジェネリック型を見つける方法はありますか?

 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
}

編集:常に文字列が来る必要はありません。

4

3 に答える 3

3

コンストラクターで型を渡す必要があります。静的係数を使用して、2回設定する必要をなくすことができます。

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
}
于 2012-12-27T11:17:03.740 に答える
3

あなたのケースで型消去を回避する唯一の方法は、ジェネリック スーパークラスを使用することです。ジェネリック型をサブクラス化する必要があり、パラメーター化された型にアクセスできます。リフレクション 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);
    }
}
于 2012-12-27T11:27:35.323 に答える
0

ピーターはかなり正しいです。さらに情報を追加したいと思います。

Class<T>コンストラクターに渡されるのインスタンスは、型 tokenと呼ばれます。

于 2012-12-27T11:30:52.587 に答える