2

先日、ジェネリックスと共変性/反変性に関して少し混乱しました。C#が共変/反変型パラメーターを指定していることは知っていますが、Javaには本当に同様の概念がありますか?

私はあなたが宣言できることを理解しています:

List<? extends String> l = ...
List<? super String> l2 =...

これで、lはリストを取得できMyString、メソッドの追加は許可されません。l2はList<Object>文字列を取得して追加できますが、ここで説明するように、要素を取得できません。Javaの共変性と反変性。ただし、これは、サブタイプ/スーパータイプを受け入れる型パラメーターを使用してリストを宣言するだけであり、次のような「適切な」共分散を実行しません。

Iterable<Animal> a = new Iterable<Dog>();

私は混乱していますか、それともJavaは単に適切な共分散定義をサポートしていませんか?ありがとう。

4

1 に答える 1

-2

Javaの型の差異は、宣言サイトではなく、使用サイトにあります。型宣言があるとしましょう

interface List<E>

共変的に使用できます(元の構文で)

List<+Animal> animals = new ArrayList<Dog>();

+型変数の注釈により、パラメーター化された型が共変になります。

それはまったく悪いことではありません。私たちも矛盾することができList<-Animal>ます。より柔軟です。

残念ながら、Java設計者は、Javaプログラマーの愚かさを過大評価しており、1文字の記号+/-が私たちを怒らせると考えています。何が起こっているのかを理解するには、英語の単語を見る必要があります。そして、冗長性が祝われるのはまだJavaの時代でした。したがって、この構文を取得します

List<? extends Animal>

絶対に遅れると思います。

于 2013-03-06T04:54:24.420 に答える