2013-01-09 8 views
16

Possible Duplicate:
Java: Instanceof and GenericsなぜinstanceofがGenericで動作しないのですか?

特定のタイプのリストに汎用リストをキャストする関数を作成しようとしています。

Cannot perform instanceof check against type parameter T. Use instead its erasure Object >instead since further generic type information will be erased at runtime.

任意の明確化や、望ましい結果を得るための方法 -

public <T>List<T> castCollection(List srcList, Class<T> clas){ 
    List<T> list =new ArrayList<T>(); 
    for (Object obj : srcList) { 
     if(obj instanceof T){ 
      ... 
     } 
    } 
    return list; 
} 

しかし、コンパイルエラーを示すobj instanceof T以下のコードを探しますか?

ありがとうございます。 :)

+1

..あなたが検索しなかったため(-1)。 try [java] generic instanceof' http://stackoverflow.com/questions/1570073/java-instanceof-and-generics、http://stackoverflow.com/questions/13768049/use-instanceof-in-a-generic-方法、http://stackoverflow.com/questions/8741984/why-t-instanceof-t-is-not-allowed-where-t-is-a-type-parameter-and-t-is-a-varia? lq = 1、http://stackoverflow.com/questions/4397660/generics-and-instanceof-java?rq=1(etc) –

答えて

33

このようにすることはできません。幸いなことに、あなたはすでにobjがクラスmyClassまたはサブクラスである場合はその代わりに

myClass.isAssignableFrom(obj.getClass()) 

を行う。これは、trueを返しますClass<T>引数を持っています。

@ILMTitanが指摘したように(ありがとう)、潜在的なNullPointerExceptionを回避するにはobj == nullを確認するか、代わりにmyClass.isInstance(obj)を使用する必要があります。どちらが必要なのか。

+5

これは、objのnullポインタが 'null'を引き起こす可能性があります。 'isInstance()'はnullポインタの問題を引き起こしません。 – ILMTitan

2

コンパイル後に汎用タイプはerased(ジェネリックはコンパイル時の型安全です)、コンパイル後に最も適用可能なタイプに置き換えられます。

あなたはこのコンパイルを行いたい場合は、具体的なタイプとTを置き換える、例

obj instance String 
4

Tは、パラメータ化された型で、コンパイルの目的のために存在します。タイプ消去のため実行時には存在しません。

したがって、obj instanceof Tは有効ではありません。

4

javaは消去を使用するため、ジェネリックタイプを使用してチェックすることはできません。

希望の結果を得るには、Class.isInstance()を使用してください。

7

短い答え:Javaの型パラメータは型の安全性を与えるためにコンパイラによってちょうど使われたものなので、

実行時に、型の削除のために型の情報が破棄されますが、instanceofは、型変数ではない具体的な型を必要とするランタイムチェックです。

+0

コンパイル時にチェックするための 'instanceof'アナログはありますか?私の場合、 'Queue'の' add'メソッドの定義の一部として 'ClassCastException'を投げようとしています。私の最初の考えは 'instanceof'でしたが、コンパイル時に' error:違法ジェネリック型for instanceof'が見つかりました。 – Ungeheuer

+0

@Ungeheuerあなたは型変数をバインドする必要があります。 – Jack

関連する問題