作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我试图理解的编译器行为的过于简化的版本:
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/
我是一名优秀的程序员,十分优秀!