2

Neal Gafter は型トークンを導入しました (例: Class<String>)。実行時にのインスタンスにアクセスできると仮定するとClass<String>、実行時にジェネリック型 ( String) を取得できますか?

Method.getGenericReturnType()に似たものを探しています。

4

4 に答える 4

2

フィールド/メソッドでのみ可能だと思います。型消去のため、実行時にクラス固有のジェネリック型を取得できません。クラスにアクセスできる場合にできるハックがあるようです。この議論を読んでください。

于 2012-07-30T18:17:09.880 に答える
1

それはあなたが望むもののように聞こえますParameterizedType

Classこれらは、aとそれに由来するオブジェクト(Method、 )を反映することで取得できますFieldParameterizedTypeただし、古いClassオブジェクトからを取得することはできません。Classジェネリッククラスまたはインターフェイスを拡張する型を表すインスタンスから取得できます。

于 2012-07-30T21:02:13.380 に答える
1

C# とは異なり、Java では実行時に Generics は存在しません。したがって、実行時にジェネリック型のインスタンスを作成したり、ジェネリック型の型を見つけたりすることはできません。

于 2012-07-30T18:20:56.270 に答える
0

Bob Lee の Gafter の Gadget パターンの精緻化のバリエーションを使用して可能です。

public class GenericTypeReference<T> {

    private final Type type;

    protected GenericTypeReference() {
        Type superclass = getClass().getGenericSuperclass();
        if (superclass instanceof Class) {
            throw new RuntimeException("Missing type parameter.");
        }
        this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
    }

    public Type getType() {
        return this.type;
    }   

    public static void main(String[] args) {

        // This is necessary to create a Class<String> instance
        GenericTypeReference<Class<String>> tr =
            new GenericTypeReference<Class<String>>() {};

        // Retrieving the Class<String> instance
        Type c = tr.getType();

        System.out.println(c);
        System.out.println(getGenericType(c));

    }

    public static Type getGenericType(Type c) {
        return ((ParameterizedType) c).getActualTypeArguments()[0];
    }

}

上記のコードは次を出力します。

java.lang.Class<java.lang.String>
class java.lang.String 
于 2012-07-30T21:35:31.150 に答える