gpt4 book ai didi

java - 为什么Java泛型允许通配符的上限高于类型参数的上限?

转载 作者:行者123 更新时间:2023-12-02 02:00:54 25 4
gpt4 key购买 nike

这是我试图理解的编译器行为的过于简化的版本:

class Scratch {
public static void main(String[] args) {
HouseCat<? extends Mammal> hcat = new Tabby();
//HouseCat<Mammal> won't work, compiler catches incorrect type parameter bound
HouseCat<CrazyHouseCat> crazyCat = new Tabby();
}
}

interface Mammal<T extends Mammal> extends Comparable<T>{
T cloneInstance();
}

interface Feline<T extends Feline> extends Mammal<T>{}

interface HouseCat <T extends HouseCat> extends Feline<T>{}

interface CrazyHouseCat<T extends CrazyHouseCat> extends HouseCat<T>{
void pushStuffOverTvStand();
}

class Tabby implements CrazyHouseCat<CrazyHouseCat>{

@Override
public CrazyHouseCat cloneInstance() {
return null;
}

@Override
public void pushStuffOverTvStand() {

}

@Override
public int compareTo(CrazyHouseCat o) {
return 0;
}
}

在上面的代码片段中,HouseCat<? extends Mammal>是比 HouseCat 接口(interface)允许的类型更广泛的引用,即: HouseCat<T extends HouseCat>

如果我尝试做类似 HouseCat<Long> 的事情编译器会告诉我 Long不满足类型参数的约束。好吧,也不是<? extends Mammal> ,至少有可能。

编译器不允许我创建违反类型参数 T 的实例的限制,但我对其使用 Mammal 的行为感到困惑作为引用的上限。 ( HouseCat , Mammal ] 之间存在无效的类型范围,那么为什么编译器不会拒绝这个引用定义呢?

澄清:我的问题不是关于通配符 ? 的含义。我问为什么编译器允许使用比参数化类型定义所允许的更广泛的类型来定义对参数化类型实例的引用。上述问题并不解决这个具体情况,而是关于通配符的含义。我的问题是关于通配符的有效范围,编译器似乎没有强制执行。

最佳答案

This看起来它回答了你的问题。基本上HouseCat<? extends Mammal>允许创建 HouseCat<[insert type that extends Mammal here]> 。全部<? extends Mammal>所做的就是充当泛型。在您的示例中,我不明白您为什么要尝试这样做,但我希望这会有所帮助。

关于java - 为什么Java泛型允许通配符的上限高于类型参数的上限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375470/

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