- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据我读到的文献,我们有 juicy fruits 实现了以下接口(interface):
public interface Juicy<T> {
Juice<T> squeeze();
}
使用有界类型变量,以下方法将获取一堆水果并将它们全部压榨:
<T extends Juicy<T>> List<Juice<T>> squeeze(List<T> fruits);
现在我们还需要下面的 sibling 来工作:
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);
如何解释这种差异?
最佳答案
<? super T>
在 <T extends Juicy<? super T>>
内有没有RedOrange
,它是 Juicy<Orange>
的子类可以在其范围内。
想象一下没有<? super T>
第一:
public <T extends Juicy<T>> List<Juice<T>> squeeze(List<T> fruits) {...
现在T
必须是 Juicy<T>
.类(class)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
的父类(super class).这允许 RedOrange
被使用,因为它是一个 Juicy<Orange>
, 和 Orange
是 RedOrange
的父类(super class).
public <T extends Juicy<? super T>> List<Juice<T>> squeeze(List<T> fruits) {...
现在调用squeeze
以上编译。
编辑
但是如果我们想要squeeze
怎么办?一个List<Juice<Orange>>
来自List<RedOrange>
?这有点棘手,但我找到了解决方案:
我们需要第二个类型参数来匹配Orange
在squeeze
方法:
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);
关于java - 类型为 'super' 的有界泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16424865/
我是一名优秀的程序员,十分优秀!