40

ジェネリックのクラスタイプを見つける方法はありませんか?

if (T instanceof String) {
    // do something...
}

上記は間違いなくコンパイルされません。

4

4 に答える 4

52

ジェネリックはコンパイル時の機能です。ジェネリックはコンパイル時にチェックを追加しますが、これは実行時には意味をなさない場合があります。これは一例です。コード内のスーパータイプである可能性がある、参照されているオブジェクトのタイプのみを確認できます。タイプ T を渡したい場合は、これを明示的に行う必要があります。

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

また

void someMethod(Class<T> tClass, T tArg) {

注: タイプは同じではない可能性があります。

someMethod(Number.class, 1);
于 2011-01-16T10:58:53.537 に答える
5

Tは変数ではなく、実行時に定義されるクラスのプレースホルダーであるため、コンパイルされません。簡単なサンプルを次に示します。

public class Test<T> {

public void something(T arg) {
    if (arg instanceof String) {
        System.out.println("Woot!");
    }
}

public static void main(String[] args) {
    Test<String> t = new Test<String>();
    t.something("Hello");
}

}
于 2011-01-16T10:52:09.673 に答える
3

サブクラスがある場合

public class SomeClass extends SomeSubclass<String>{}

public class SomeSubclass<T> {}

次に、コードを実行して T の型を発見する方法があります

Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
    Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
    // in simple cases actualTypeArguments will contain Classes, since Class implements Type
}

ケースがもう少し複雑な場合 ( ? extends String)` org.ormunit.entity.AEntityAccessor#extractClassを見てください

于 2011-01-16T20:25:48.183 に答える