假设您有:
public interface A {}
public class B implements A {}
public class C {
void foo (List<A>) {}
}
public class Test {
//Declaration one
List<A> x = new List<A>();
//Declaration two
List<A> x = new List<B>();
B b = new B();
x.add(b);
new C().foo(x);
}
现在显然声明一是执行此操作的正确方法,并且您在声明二上收到编译错误。我想知道为什么 Java 选择以这种特定方式强制执行类型安全;如果猫列表仍然是动物列表,为什么期望动物列表的方法会拒绝接收一堆猫呢?
好奇心比什么都重要——也是一个更好地完善我的知识的机会。
干杯,
戴夫.
Java 泛型不是协变。如果你能做到这一点:
ArrayList<Animal> x = new ArrayList<Cat>();
那么你就可以这样做:
x.add(new Dog());
这违反了一个概念ArrayList<Cat>
只能持有Cat
对象(或子类对象)。
阅读本文了解更多详细信息:Java 理论与实践:泛型陷阱.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)