オブジェクトがジェネリック型のインスタンスであるかどうかを判断する方法はありますか?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
それは明らかに機能しません。代替手段はありますか?Javaリフレクションを使用してクラスをインスタンス化し、それがジェネリック型であることを確認したいのと同じですT
。
オブジェクトがジェネリック型のインスタンスであるかどうかを判断する方法はありますか?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
それは明らかに機能しません。代替手段はありますか?Javaリフレクションを使用してクラスをインスタンス化し、それがジェネリック型であることを確認したいのと同じですT
。
このチェックを実行できる唯一の方法はClass
、タイプを表すオブジェクトがある場合です。
Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
//...
}
Mark Petersのサンプルを拡張するには、次のようなことをしたいことがよくあります。
Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
T t = type.cast(obj);
// ...
}
Mark Petersが述べたように、クラスタイプをパラメーターとして渡したくない場合は、次のコードを使用できます。DavidO'Mearaに敬意を表します。
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(obj)) {
...
}
あなたはこれを試すことができます、
// 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>
、問題のオブジェクトと同じであるかどうかを確認して見つけることができます。
ただし、これは私たちがジェネリックスを持っているまさにその理由に反することに注意してください。ジェネリック型を使用することは、それが実際にどの型であるか(指定できる上限と下限まで)を気にしないと言う方法です。