オブジェクトがジェネリック型のインスタンスであるかどうかを判断する方法はありますか?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
それは明らかに機能しません。代替手段はありますか?Javaリフレクションを使用してクラスをインスタンス化し、それがジェネリック型であることを確認したいのと同じですT
。
回答:
このチェックを実行できる唯一の方法Class
は、タイプを表すオブジェクトがある場合です。
Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
//...
}
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Mark Petersが述べたように、クラスタイプをパラメーターとして渡したくない場合は、次のコードを使用できます。DavidO'Mearaへの称賛。
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(obj)) {
...
}
Type safety: Unchecked cast from Type to Class<T>
あなたはこれを試すことができます、
// Cast your object to the generic type.
T data = null;
try {
data = (T) obj;
} catch (ClassCastException cce) {
// Log the error.
}
// Check if the cast completed successfully.
if(data != null) {
// whatever....
}
タイプT
をパラメータ化するためにタイプが使用される場所に制限を設ける方が理にかなっていClass
ます。タイプを渡すときは、のようなものを使用する代わりに、を使用Class<?>
する必要がありますClass<? extends T>
。
これは、タイプTのオブジェクトがある場合にのみ(部分的に)機能します。次に、そのオブジェクトのクラスを取得し、java.lang.Class<T>
問題のオブジェクトと同じであるかどうかを確認して見つけることができます。
ただし、これは私たちがジェネリックスを持っているまさにその理由に反することに注意してください。ジェネリック型を使用することは、それが実際にどの型であるか(指定できる上限と下限まで)を気にしないと言う方法です。
type
、メソッドのパラメータとして、多分あなたはそれを初期化したい:Class type = ((T) new Object()).getClass();