gpt4 book ai didi

java - 类型为 'super' 的有界泛型方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:37 26 4
gpt4 key购买 nike

根据我读到的文献,我们有 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)OrangeJuicy<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> , 和 OrangeRedOrange 的父类(super class).

public <T extends Juicy<? super T>> List<Juice<T>> squeeze(List<T> fruits) {...

现在调用squeeze以上编译。

编辑

但是如果我们想要squeeze怎么办?一个List<Juice<Orange>>来自List<RedOrange> ?这有点棘手,但我找到了解决方案:

我们需要第二个类型参数来匹配Orangesqueeze方法:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com