在< T延伸Juicy>是否存在RedOrange,它是Juicy< Orange>的子类.可以在其范围内.
想象没有第一:
public > List> squeeze(List fruits) {...
现在T必须是Juicy< T>. Orange类是Juicy< T>,它是Juicy< Orange>.但RedOrange类不是Juicy< T>.它不是Juicy< RedOrange> ;;它是Juicy< Orange>.所以当我们尝试调用squeeze时:
List redOranges = new ArrayList();
List> juices = squeeze(redOranges);
我们得到以下编译器错误:
Inferred type 'RedOrange' for type parameter 'T' is not within its bound; should implement 'Juicy'.
如果我们放置,它允许Juicy的类型参数成为T的超类.这允许使用RedOrange,因为它是Juicy< Orange>,而Orange是RedOrange的超类.
public > List> squeeze(List fruits) {...
现在,挤压上面的调用编译.
编辑
但是如果我们想要挤压List< Juice< Orange>>从列表< RedOrange>?它有点棘手,但我找到了一个解决方案:
我们需要第二个类型参数来匹配squeeze方法中的Orange:
public , T extends Juicy> List> squeeze(List fruits)
这里,S表示橙色,因此我们可以返回List< Juice< Orange>>.现在我们可以说
List redOranges = new ArrayList();
List> juices = squeeze(redOranges);