2

Javaにローカル変数のジェネリック型を反映する方法はありますか?私はあなたがフィールドでそれをするべきだと知っています-ジェネリック型のjava.util.Listを取得します。たとえば、どのように解決するかについてのアイデア:

public void foo(List<String> s){
  //reflect s somehow to get String
}

またはさらに一般的:

public void foo<T>(List<T> s){
  //reflect s somehow to get T
}
4

2 に答える 2

7

いいえ。Javaの型消去により、コンパイルプロセス中にすべてのジェネリックが削除されます。

ただし、リスト内の要素instanceOfまたは要素を使用して、それらが特定のタイプに一致するかどうかを確認できます。getClass

于 2012-08-03T15:42:35.777 に答える
1

これは、リフレクションを使用してジェネリック型をいつどのように読み取ることができるかを示す優れたチュートリアルです。たとえば、firsfooメソッドからStringを取得するには

public void foo(List<String> s) {
    // ..
}

このコードを使用できます

class MyClass {

    public static void foo(List<String> s) {
        // ..
    }

    public static void main(String[] args) throws Exception {
        Method method = MyClass.class.getMethod("foo", List.class);

        Type[] genericParameterTypes = method.getGenericParameterTypes();

        for (Type genericParameterType : genericParameterTypes) {
            if (genericParameterType instanceof ParameterizedType) {
                ParameterizedType aType = (ParameterizedType) genericParameterType;
                Type[] parameterArgTypes = aType.getActualTypeArguments();
                for (Type parameterArgType : parameterArgTypes) {
                    Class parameterArgClass = (Class) parameterArgType;
                    System.out.println("parameterArgClass = "
                            + parameterArgClass);
                }
            }
        }
    }
}

出力:parameterArgClass = class java.lang.String

リストに文字列のみを含めることができることをソースコードで明示的に宣言したため、これが可能でした。ただし、

public <T> void foo2(List<T> s){
      //reflect s somehow to get T
}

Tは何でもかまいません。型消去のため、正確なTクラスに関する情報を取得することはできません。

于 2012-08-03T15:52:02.903 に答える