-1

Javaで、これらのインターフェースとクラスを想像してみてください。

public interface Iface<S, T> { ... }

public class Parent<A, B> implements Iface<B, A> { ... }

public class Sub extends Parent<String, Integer> { ... }

Ifaceジェネリックの型であるを受け入れて取得する関数を作成する方法はありますか?したがって、たとえば、Sub.class:を入力すると

public void showTypes(Class<Iface<S, T>> ifaceClass) {
    // do something...
}

//showTypes(Sub.class) --> S = Integer.class, T = String.class

編集:型消去について。あなたが持っているなら、ArrayList<?>あなたはそれがどのジェネリックタイプであるかを知ることができません。しかし、この場合は異なります。拡張するクラスがある場合ArrayList<String>、そのジェネリック型(String.class)を知ることができます。このスニペットを見てください:

@SuppressWarnings("serial")
public class StringList extends ArrayList<String> {
    public static void main(String... args) {
        ParameterizedType superType = 
            (ParameterizedType) StringList.class.getGenericSuperclass();
        Type[] types = superType.getActualTypeArguments();
        Class<?> clss = (Class<?>) types[0];
        System.out.println(clss);
    }
}
4

3 に答える 3

2

さて、私は探していたものを見つけました。TypeToolsは、まさにこれを行うように設計された、クラスが 1 つだけの小さなライブラリです。残念なことに、Maven 中央リポジトリにはありません。

TypeResolver.resolveArguments(Sub.class, Iface.class) --> [java.lang.Integer, java.lang.String]

Spring には、GenericTypeResolverに同様のメソッドがあります。

GenericTypeResolver.resolveTypeArguments(Sub.class, Iface.class);
于 2013-01-22T12:46:56.587 に答える
0

いいえ、Java でのジェネリックの実装方法が原因で、これを行うことはできません。実行時に、ジェネリック パラメーターに使用される実際の型に関する情報は残りません。

ここでタイプ消去の詳細を読むことができます

于 2013-01-22T10:11:23.740 に答える
-1
Update 01.23:

私たちと他の回答者は、ゆるい具体的な質問に答えたので、-1票に値しません....あまり公平ではありません...

Original answer:

いいえ、それは仕方がありません...

ジェネリックの主な仕様では、T と S を使用すると、次のコードが生成されます。

public void showTypes(Class<Iface<Object, Object>> ifaceClass) {
    // do something...
}

だから、あなたはこの情報を知らないでしょう...

次のようなジェネリック型のクラスを定義するソリューションを用意できます。

public void showTypes(T type)
{
if (s instanceof Number) 
 System.out.println("Number")
if (s instanceof String) 
 System.out.println("String")
}

しかし、私が見るように、これはあなたの場合のオプションではありません...

そして、コンパイル時ではなく、実行時にのみ決定されます...

于 2013-01-22T10:13:25.800 に答える