泛型中的通配符:"?超级T”工作时 "?延伸T”不?
我的问题是关于Java 7中的泛型。假设我们有这样的类层次结构:
interface Animal {}
class Lion implements Animal {}
class Butterfly implements Animal {}
就像 Java 泛型教程
我们还有一个类
class Cage<T> {
private List<T> arr = new ArrayList<>();
public void add(T t) {
arr.add(t);
}
public T get() {
return arr.get(0);
}
}
,这里是使用该类的代码:
public static void main(String[] args) {
Cage<? extends Animal> cage = new Cage<>();
Animal a = cage.get(); //OK
cage.add(new Lion()); //Compile-time error
cage.add(new Butterfly()); //Compile-time error
}
问题 #1:
我已阅读 此处介绍了这些问题,但就像 Cage ;
。但我告诉编译器 ,因此
Cage
中的 T
类型将是 Animal 类型的任何子类型。那么为什么它仍然给出编译时错误呢?
问题#2:
如果我指定Cage<?超级动物>笼=...
而不是Cage<?延伸动物> age = ...
一切正常,编译器没有说任何不好的事情。为什么在这种情况下它工作得很好,而在上面的例子中却失败了?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
笼子必须能够容纳两种类型的动物。 “super”表示 - 它表示笼子必须能够容纳所有类型的动物 - 也许还可以容纳其他一些东西,因为
? super Animal
可能是 Animal 的超类。 “extends”表示它可以容纳某些种动物 - 例如,也许只是狮子,如下所示:这将是一个有效的陈述,但显然狮子笼不能容纳蝴蝶,所以
不会不编译。该语句
也不会编译,因为 Java 正在查看笼子的声明 -
Cage
- 不是现在分配给它的对象 (Cage
)。我所知道的对泛型最好的描述是O'Reilly 的 Java in a Nutshell。本章免费在线 - 第 1 部分 和 第 2 部分。
The cage must be able to hold both types of animals. "super" says that - it says that the Cage must be able to hold all types of animals - and maybe some other things, too, because
? super Animal
might be a superclass of Animal. "extends" says that it can hold some kinds of animals - maybe just Lions, for instance, as in:which would be a valid statement, but obviously the lion cage won't hold butterflies, so
wouldn't compile. The statement
wouldn't compile either, because Java here is looking at the declaration of the cage -
Cage<? extends Animal>
- not the object that's assigned to it right now (Cage<Lion>
).The best description of generics I know of is in O'Reilly's Java in a Nutshell. The chapter is free online - part 1 and part 2.