我知道Java是静态语言,并且在涉及数组时有动态检查:但我不明白为什么会发生这种情况,有人可以在这两种情况下向我解释这个例子:A []是B的子类型[],还是 B[] 是 A[] 的子类型?哪个会失败,为什么?
f(A[] as) {
as[0] = new A(); // **?!**
}
B[] bs = new B[10];
f(bs); // **?!**
B b = bs[0]; // **?!**
我知道Java是静态语言,并且在涉及数组时有动态检查:但我不明白为什么会发生这种情况,有人可以在这两种情况下向我解释这个例子:A []是B的子类型[],还是 B[] 是 A[] 的子类型?哪个会失败,为什么?
f(A[] as) {
as[0] = new A(); // **?!**
}
B[] bs = new B[10];
f(bs); // **?!**
B b = bs[0]; // **?!**
Java 中的数组是协变的。
这意味着 ifB
是A
then的子类型,B[]
也是 的子类型A[]
。因此,您可以传递预期的B[]
位置A[]
,就像您可以传递预期的B
位置一样A
。
但是如果你走相反的路,那么你需要一个明确的演员,比如 -
B b = (B) new A(); //bypasses the compiler but fails at runtime
B[] bs = (B[]) new A[1]; //also bypasses the compiler but fails at runtime