3

私は Java を学び始めていますが、ジェネリックについて質問があります。

Collection<E>インターフェイス からのこのメソッドでは:

boolean containsAll( Collection <?> c);
boolean removeAll(Collection<?> c);
boolean retainAll ( Collection <?> c);

パラメータが の Collection <?> c代わりにあるのはなぜCollection <E> cですか?

どうもありがとう

4

2 に答える 2

2

ワイルドカードはすべての型で機能しますが、E型パラメーターを指定する必要があるため?です。微妙な違いは、

  • E指定された任意のタイプを意味します
  • ?不明なタイプを意味します

メソッドは未知の型のコレクションで動作するはずなので、型パラメーターをまったく指定しません。E型変数です。?は変数ではありません。指定できないプレースホルダーです。

于 2013-02-11T00:03:59.673 に答える
2

JDK 設計者は、次のようなコードが可能になることを望んでいました。

Collection<String> strings = Arrays.asList("foo", "bar", "baz");
Collection<Object> objects = Arrays.asList("foo", 123);
strings.removeAll(objects);
// strigns now contains only "bar" and "baz"

Arrays.asList()(上記のコードは、型パラメーターをキャプチャする方法を思い出せないため、正確にコンパイルされない可能性がありますが、要点は理解できるはずです。)

つまり.equals()、オブジェクトの任意のペアを呼び出して意味のある結果を得ることができるため、これらのメソッドを特定の項目タイプに制限する必要はありません。

于 2013-02-11T00:24:21.373 に答える