私が読んだ文献によると、次のインターフェースを実装したジューシーな果物があります。
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);
この違いを説明するものは何ですか?