2012-02-19 9 views
2

今、私のコードでは、裸の汎用クラスまたはワイルドカードを使用して問題を解決できることがわかりました。それはジェネリック医薬品なしであったであろうよりも、一般的には間違いなく<?>をJava Genericsで使用する「良い」理由は何ですか?

Class World<T, C> { .... } 

私のコードクリーナーを作っている:

は、私はこのようなクラスがデザインを持っています。

しかし、時々私は

World theWorld; 

または時々私は

World<?, ?> theWorld; 

で終わる使用し、それはコンパイラが、私の 試みを受け入れる作るために必要なもののようですので、私はこれを行いますそれらが私をより多くのキャスティングまたは継承する複雑さに導くのを避けるために。

それは私には醜いにおいがしますが、それを避けるために導入する必要があるように見える複雑さを正当化できません。

裸であるかワイルドカードで指定されたジェネリックを使用すると、慣れ親しんだJavaと思われるケースは何ですか?

答えて

3

いつでもを使用していますが、にはが必要です。 <?>はコンパイラにおおよそのことを伝えます。「ジェネリックについて知っていますが、今はタイプが必要ありません。

他の状況ではタイプが必要なのかもしれません。例えば。 Setがあれば、キャッシュのようなものだけを格納していて、要素のタイプはまったく気にしません。特定の要素を処理するときは、他のときに行います。

緩くバインドされたタイプのパラメータ(あまりにも緩い<?>など)を使用しても、後でタイプを判別しようとすると匂いがします。 instanceofまたはカスタムタイプのディスクリミネータを使用します。それから何かがうまく設計されていなかった。

4

GenericsチュートリアルのWildcardsセクションに<?>という良い例があります(ユースケース)。

ソートの要約:すべての種類のCollectionを受け入れるprintCollectionメソッドを書きたい場合は、Collection<?>をパラメータタイプとして使用できます。この目的のために、すべての種類のコレクションのスーパータイプではないため、Collection<Object>をパラメーター・タイプとして使用することはできません。

あなたはprintCollection方法で(ヌルを除く)Collection<?>に項目を追加することはできませんので、代わりにこのケースでCollection「純粋」のCollection<?>を使用する方が安全です。

+0

[OK]を私は、私は従わないことを除いては...理にかなっていると思う「それは、コレクションのすべての種類のスーパータイプではないので、あなたは、この目的のためのパラメータの型としてコレクションを使用することはできません。」私はあなたがそれを行うことができない理由は、コレクションは特にコレクションと同じではないことであると思っているだろう...それはだろうと思いました。一方、コレクション<? extends Object>は論理的ですが、これはCollection と等価です。あなたは確認できますか? – pitosalas

+0

コレクションとCollection <? extends Object>はほぼ同じです。わずかな違いのためこの回答を参照してください。http://stackoverflow.com/a/2016382/122442 –

1

ワイルドカードは、別のクラスのサブクラスである複数のオブジェクトを保存する場合にも非常に便利です。例えば

Collection<? extends Shape> myShapes 

このコレクションは現在、Shapeのサブクラスであるすべてのオブジェクトを、保つことができます。 Shapeのサブクラスであるオブジェクトを追加するときは、型保護されています。例:

myShapes.add(new Rectangle()) 
myShapes.add(new Triangle()) 
+0

興味深いです!私は "Collection a;"を試みました。これが無効であることが判明しました。だから "?"代わりに! – pitosalas

+0

TはTとすぐ、そのクラスのオブジェクトがインスタンス化されているようにVMに知られているであろうことを意味し、あなたがそれを実装したクラスは、それ自体で、一般的な場合にのみ機能します。 – devsnd

関連する問題