<T extends Juicy<? super T>>
中的<? super T>
是为了让Juicy<Orange>
的子类RedOrange
满足其约束条件。
想象一下没有<? super T>
:
public <T extends Juicy<T>> List<Juice<T>> squeeze(List<T> fruits) {...
现在,
T
必须是一个
Juicy<T>
。类
Orange
是一个
Juicy<T>
,它是一个
Juicy<Orange>
。但是类
RedOrange
不是一个
Juicy<T>
。它不是一个
Juicy<RedOrange>
;它是一个
Juicy<Orange>
。因此,当我们尝试调用
squeeze
时:
List<RedOrange> redOranges = new ArrayList<RedOrange>();
List<Juice<RedOrange>> juices = squeeze(redOranges);
我们收到以下编译器错误:
Inferred type 'RedOrange' for type parameter 'T' is not within its bound; should implement 'Juicy<RedOrange>'.
如果我们把
<? super T>
放置在这里,就可以让
Juicy
的类型参数成为
T
的超类。这样就可以使用
RedOrange
,因为它是一个
Juicy<Orange>
,而
Orange
是
RedOrange
的超类。
public <T extends Juicy<? super T>> List<Juice<T>> squeeze(List<T> fruits) {...
现在,上面对`squeeze`的调用已经编译通过。
编辑:
但是,如果我们想从`List`中挤压出一个`List>`呢?这有点棘手,但我找到了解决方案:
我们需要第二个类型参数来匹配`squeeze`方法中的`Orange`。
public <S extends Juicy<S>, T extends Juicy<S>> List<Juice<S>> squeeze(List<T> fruits)
这里,S
代表Orange
,因此我们可以返回List<Juice<Orange>>
。现在我们可以说
List<RedOrange> redOranges = new ArrayList<RedOrange>();
List<Juice<Orange>> juices = squeeze(redOranges);
public interface Juicy<T extends Juicy<T>>
吗?(以防止class Orange extends Fruit implements Juicy<Apple>
) - SLaksApple
实现了Juicy<Apple>
,那么您提到的情况就不会被防止。 - Mark Petersclass Orange extends Fruit implements Juicy<String>
来避免。 - SLaks