ジェネリックのクラスタイプを見つける方法はありませんか?
if (T instanceof String) {
// do something...
}
上記は間違いなくコンパイルされません。
ジェネリックのクラスタイプを見つける方法はありませんか?
if (T instanceof String) {
// do something...
}
上記は間違いなくコンパイルされません。
ジェネリックはコンパイル時の機能です。ジェネリックはコンパイル時にチェックを追加しますが、これは実行時には意味をなさない場合があります。これは一例です。コード内のスーパータイプである可能性がある、参照されているオブジェクトのタイプのみを確認できます。タイプ T を渡したい場合は、これを明示的に行う必要があります。
void someMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
また
void someMethod(Class<T> tClass, T tArg) {
注: タイプは同じではない可能性があります。
someMethod(Number.class, 1);
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");
}
}
サブクラスがある場合
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を見てください