您的第一个声明
Organic<? extends Organic> compound
表示
compound可能 是一个
Organic<SomeSubtypeOfHexane>(因为
Aliphaticextends
Organic,
Hexaneextends
Aliphatic和
SomeSubtypeOfHexaneextended
Hexane)。
在这种情况下,
compound.react(new Organic()),
compound.react(newAliphatic())并
compound.react(newHexane())会导致一个类型的错误,因为
E在
compound必须是一个
SomeSubtypeOfHexane(或它们的子类型)。
您的第二份声明
Organic<? super Aliphatic> compound
表示
compount可能 是一个
Organic<Aliphatic>。
在这种情况下,
compound.react(new Organic())将导致类型错误,因为它
E必须是
Aliphatic(或其子类型)。
请记住,使用
A<? extends B>或声明变量
A<? super B>
- 扩展 了可以分配给它的对象的数量,因此,
- 限制 了变量可以做什么。
由于类的确切类型是未知的(只有 约束
是已知的),因此编译器不得不出于安全考虑而犯错,并禁止某些不是协变的或互变的 *** 作。(如果您还不熟悉它,协方差和逆方差是此类泛型的科学背景。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)