2013-03-08 5 views
17
は、私たちは、私は以下のクラスがあるとしましょう

:ベースは、メソッドに渡された

  • 動物

動物ですクラス、猫、犬、そして牛はそれぞれそれをサブクラス化します。

それが彼らの上に動作する汎用的な機能を作るために理にかなっているように、私は今、これらの各同じように使用されているSet<Cat>Set<Dog>Set<Cow>を持っている:

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals) 

これは素晴らしい作品、私ができます自由に私のセットを渡しても問題ありません。

問題が表示されます。パラメータvalにAnimal toAddを追加できません。グーグルでは、メソッドを変更すると、次のように表示されます。

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals) 

私はパラメータvalにAnimalを追加できます。これを除いて、私はサブクラスの猫、犬、牛のセットを渡すことはできません。さらなる研究は、ブートへの警告なしで、次の作品、と言われます:

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 

問題があること、私はこの方法は、動物のすべてが持っている呼び出しを実行できるようにする必要があります。私はキャストが必要です一般的な機能を維持し、することはできません。この問題を回避するどのような方法が

((Animal)toAdd).getAnimalType() 

あります:これは簡単なキャストを使用して周りを得ていますか?私のセットを作るのとは別に、この例の場合、すべての基本タイプ、動物セットを設定しますか?

+2

*ここでHTMLコードを使用せずに<>使用できる方法はありますか?* =>はい、私の編集を参照してください。あなたはめったにSOのhtmlを使う必要はありません。 – assylias

+2

+1あなたの以前の研究のために。悲しいことに、このサイトではまれなことです。 –

+0

@assyliasありがとう。今、私が質問をする必要がある次回に覚えていればいいのです。 – Legowaffles

答えて

13

良い研究、あなたはほとんどそこにいました。 Tに上限を追加するだけです。

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals) 
+1

ありがとう、これは動作します。私はそれをできるだけ8分後に答えとしてマークします。 – Legowaffles

+0

このメソッドのシグニチャが意味するものを綴ることは有益かもしれません。つまり、 '' Animal'や 'Animal'のサブクラス(' Cat'のような)の型 'T'を与えられた場合、このメソッドは' T'型と 'T'型の' Set'の2つの引数を取ります( 'Set 'のようなもの)、 '' Set 'のようなスーパータイプのものがあります。 '? 'Set'引数からの' super'は 'Set 'では動作しません。しかし、 'Set <? Animal> 'は機能しません。なぜなら、' <? Animal>は 'Animal'または' Animal'のサブクラス*であるが、どのサブクラス*か分からない型を意味します。 –