2012-02-15 6 views
0

実行時にジェネリック型の情報が消去されるため、無制限のワイルドカード型以外のパラメータ化された型に対してinstanceof 演算子を使用することはできません。ジェネリックでInstanceOfメソッドを使用しますか?

私は効果的なJavaの版2からこの文を抽出し、それがINSTANCEOFを使用するための好ましい方法であることを言う:

// Legitimate use of raw type - instanceof operator 
if (o instanceof Set) { // Raw type 
Set<?> m = (Set<?>) o; // Wildcard type 
... 
} 

いくつかの体はコンセプトを説明していただけますが(私は具体化して消去概念を理解)

答えて

7

消去の仕組みを理解していれば、instanceofは消去されたタイプをチェックする方法がないことがわかっているので、rawタイプでのみ使用できます。

同じ行に沿って、オブジェクトが何らかの並べ替えであることを確認した後、Setにどのような種類の型があるかわからないことがあります。したがって、あなたは(安全に)Set<?>を使用することができます(つまり、あなたがセットから引き出したものはObject以上に絞り込むことはできず、何も入れることはできません)。

+2

+1 - これは、あなたがOPを使わずに引用したテキスト/コードについて何を伝えているかわかりません。 –

+0

興味深いことに、 'x instanceof Map'は引き続きコンパイラ警告を生成します(その生の型は使用しないでください)。矛盾した種類。 – Thilo

関連する問題