我的问题是关于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<?>
这样的东西。但是我告诉编译器<? extends Animal>
,所以Cage<T>
中的类型T
将是Animal类型的任何子类型。那么为什么它仍然会出现编译时错误?
问题2:
如果我指定Cage<? super Animal> cage = ...
而不是Cage<? extends Animal> cage = ...
,一切都正常工作,编译器没有报错。为什么在这种情况下它能正常工作,而在上面的例子中它失败了?
<? super Animal>
理解为控制哪些类可以被赋值给变量 "cage",而不是控制 cage 可以容纳哪些对象。因此,这意味着 Cage 必须是 Cage<Animal 或其超类>,这意味着它可以处理所有动物。这样理解有帮助吗?这确实令人困惑! - Ed Staub