3

私はJavaを初めて使用し、Java Generics and Collectionsの本から以下の奇妙な構文を理解しようとしています。(私はC ++テンプレートを幅広く使用したため、ジェネリックプログラミングの基本と考えられる落とし穴を理解していると主張できます)。

interface Collection <E> {
  ...
  public boolean addAll(Collection<? extends E> c);
  ...
}

上記を次のように記述できないのはなぜですか。

interface Collection <E> {
  ...
  public boolean addAll(Collection<T extends E> c);
  ...
}

違いはなんですか?それは単なる言語制限ですか、それとも内部で何か違いがありますか?

4

2 に答える 2

8

それは次のように書くことができます

 public <T extends E> boolean addAll(Collection<T> c)

しかし、意味がありません。そのパラメータに名前を付ける必要はありません。

于 2013-02-18T18:43:30.293 に答える
3

メソッドが T 型の何かを返す場合、それは理にかなっています。その後、両方の型を一致させることができます。ただし、ブール値を返すだけなので、それを行う必要はありません。その場合、名前 T を設定する必要はなく、疑問符のままです。

addAll がフィルターを取るとしましょう:

public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter);

Predicate には、コレクション c を操作できるジェネリック型があることがわかりました。

于 2013-02-18T18:44:58.870 に答える