96

オブジェクトがジェネリック型のインスタンスであるかどうかを判断する方法はありますか?

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

それは明らかに機能しません。代替手段はありますか?Javaリフレクションを使用してクラスをインスタンス化し、それがジェネリック型であることを確認したいのと同じですT

4

6 に答える 6

142

このチェックを実行できる唯一の方法はClass、タイプを表すオブジェクトがある場合です。

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}
于 2011-04-20T18:14:51.830 に答える
26

Mark Petersのサンプルを拡張するには、次のようなことをしたいことがよくあります。

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}
于 2011-04-20T18:25:08.780 に答える
13

Mark Petersが述べたように、クラスタイプをパラメーターとして渡したくない場合は、次のコードを使用できます。DavidO'Mearaに敬意を表します。

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }
于 2018-02-02T07:58:14.117 に答える
6

あなたはこれを試すことができます、

// 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....
}
于 2015-04-23T15:36:20.330 に答える
3

Tタイプをパラメータ化するためにタイプが使用される場所に制限を設ける方が理にかなっていClassます。タイプを渡すときは、のようなものを使用する代わりに、を使用Class<?>する必要がありますClass<? extends T>

于 2011-04-20T18:14:35.043 に答える
1

これは、タイプTのオブジェクトがある場合にのみ(部分的に)機能します。次に、そのオブジェクトのクラスを取得しjava.lang.Class<T>、問題のオブジェクトと同じであるかどうかを確認して見つけることができます。

ただし、これは私たちがジェネリックスを持っているまさにその理由に反することに注意してください。ジェネリック型を使用することは、それが実際にどの型であるか(指定できる上限と下限まで)を気にしないと言う方法です。

于 2011-04-20T18:16:23.633 に答える