7

私が読んだ文献によると、次のインターフェースを実装したジューシーな果物があります。

public interface Juicy<T> {
    Juice<T> squeeze();
}

制限された型変数を使用すると、次のメソッドはたくさんの果物を取り、それらすべてを絞ります:

<T extends Juicy<T>> List<Juice<T>> squeeze(List<T> fruits);

ここで、以下の下位の兄弟も機能する必要があります。

class Orange extends Fruit implements Juicy<Orange>;
class RedOrange extends Orange;

したがって、メソッドは次のようになると思います。

<T extends Juicy<T>> List<Juice<? super T>> squeeze(List<? extends T> fruits);

代わりに、メソッドのシグネチャは次のようになります。

<**T extends Juicy<? super T>>** List<Juice<? super T>> squeezeSuperExtends(List<? extends T> fruits);

この違いを説明するものは何ですか?

4

2 に答える 2

3

これについて考える最も簡単な方法は、果物の種類とそれが生成する果汁の種類との関係を簡単に無視することです. そのリンクはクラス宣言で確立されます。たくさんのJuicys を絞り込む必要はありません。

Juiceつまり、Juicys が生成する型をパラメータ化するだけです。

<T> List<Juice<T>> squeeze(List<? extends Juicy<? extends T>> fruits);

Juiceここでは、フルーツの一般的なスーパー タイプではなく、プロデュースされた一般的なスーパー タイプ(つまり のパラメータ) に基づいてジュースのリストを作成しますJuicy

次に、以下を取得します。

//works
List<Juice<Orange>> b = squeeze(Arrays.asList(new Orange(), new RedOrange()));

//fails as it should 
List<Juice<RedOrange>> d = squeeze(Arrays.asList(new RedOrange()));
于 2013-05-07T17:45:21.590 に答える