考虑以下 Java 类定义:
class Animal {}
class Lion extends Animal {}
Cage
在为s定义协变时,Animal
我在 Java 中使用以下代码:
class Cage<T extends Animal> {
void add(T animal) { System.out.println("Adding animal..."); }
}
但是下面的 Java 示例...
public static void main(String... args) {
Cage<? extends Animal> animals = null;
Cage<Lion> lions = null;
animals = lions; // Works!
animals.add(new Lion()); // Error!
}
...无法编译并出现以下错误:
Cage 类型中的方法 add(capture#2-of ? extends Animal) 不适用于参数(Lion)
这样做是因为否则Tiger
可能会在运行后添加不同的类型animals = lions
并在运行时失败?
如果只有一个子类型,是否可以制定一个不会拒绝它的特殊(假设)规则Animal
?
(我知道我可以将add
'sT
替换为Animal
。)