我知道Java是静态语言,对数组有动态检查:
但我不明白为什么会发生这种情况,有人可以在以下两种情况下向我解释此示例:A []是B []的子类型,或者B []是A []的子类型吗?哪个会失败,为什么?

f(A[] as) {
  as[0] = new A(); // **?!**
}

B[] bs = new B[10];
f(bs); // **?!**
B b = bs[0]; // **?!**

最佳答案

Java中的数组为covariant

这意味着,如果BA的子类型,则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

09-13 11:43