2009-10-02 15 views
7

は、私は次のコード使用ジェネリックはチェック変換の警告

String innerText = null; 
innerText = this.getException(detail.getChildElements()); 

は、この警告を引き起こしている原因

型の安全性:型イテレータの発現は、イテレータする を準拠するように未チェックの変換を必要と

参照されるメソッドは

です。
private String getException(Iterator<OMElementImpl> iterator) { ... } 

他の方法getChildElements()は、私が触れることができないJARファイルにあります。その他の警告やエラーはありません。

グーグルからの警告のこの種を取り除くために、通常の方法が

@SuppressWarnings("unchecked") 
String innerText = this.getException(detail.getChildElements()); 

であるように、コンパイラは、事前に安全性を保証することはできませんが、私はSuppressWarningsの使用を避けることを好むと思いますので、それはそうです可能であればもっと良い方法がありますか?

EDIT:getChildElements()は警告を抑制することができますhere

+5

Javaジェネリックでコードをコンパイルすることができます。個人的に私はそこに警告を残すだろう - それは完全に有効な警告です。 –

答えて

16

を文書化されていますが、そうならば、あなたは、サードパーティのライブラリーに100%頼って、Javaのジェネリック型の保証を破棄されています。その実行時に発生したClassCastExceptionは、明示的キャスト時に発生します。

私たちのコーディング標準は、私たちがを証明コードがタイプセーフ—であることができ、我々はブラックボックスとしてパッケージ外の任意の呼び出しを扱う、との内容に関するコメントに依存しない場合にのみ、警告を抑制することです生のコレクション。したがって、抑制は非常にまれです。通常、コードが型セーフであれば、コンパイラはそれを判断できますが、時には助けを必要とすることもあります。例外として、プライベートコンテキストから「エスケープ」しないジェネリック型の配列があります。

サードパーティライブラリを完全に信頼していない場合は、新しいコレクションを作成し、キャスト後にそのコンテンツをOMEElementImplに追加してください。そうすれば、図書館にバグがあるとすぐに、時間と空間ではるかに離れたコードをClassCastExceptionで吹き飛ばしたのではなく、すぐにそのことを知ることができます。例えば

Iterator<?> tmp = detail.getChildElements(); 
Collection<OMElementImpl> elements = new ArrayList<OMElementImpl>(); 
while (tmp.hasNext()) 
    elements.add((OMElementImpl) tmp.next()); /* Any type errors found here! */ 
String innerText = getException(elements.iterator()); 

覚えている、ジェネリック医薬品はかなり見て、少ない入力を必要とコードを作るために考案されませんでした!ジェネリックの約束はこれです:あなたのコードは、警告なしでコンパイルされた場合、型保証されていることが保証されています。それはそれです。警告が無視されるか抑制されると、キャスト演算子のないコードでは、ClassCastExceptionが不思議に上がります。


アップデート:この場合、特に、getChildElementsの結果はOMElementImplのイテレータであると仮定することは非常に危険なようです。せいぜい、あなたはそれらがOMElementであると仮定するかもしれません、そして、それはそのクラスからのみ暗示されています。

+0

このような第三者図書館から返されたコレクションの内容を確認することは良いアドバイスです。 –

+0

新しいコレクションを作成する代わりに、Google Collectionsの「Iterables.transform」を参照してください。http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#transform java.lang.Iterable、%20com.google.common.base.Function) –

+0

まあ、私は新しいジュニア開発者であり、この特定のケースでは仮定を立てることは大丈夫です。私(そして私の技術リーダー)はちょっとした警告アイコンを見るのが嫌いです。 + 1 /良い一般的なアドバイスを与えるために受け入れ、しかし。 – Pops

関連する問題