0

Javaは静的言語であり、配列に関しては動的チェックがあることを知っています:しかし、なぜこれが起こるのか理解できません.A[]がBのサブタイプである場合の両方のケースで、誰かがこの例を説明してもらえますか? []、または B[] は A[] のサブタイプですか? どちらが失敗し、その理由は?

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

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

1 に答える 1

2

Java の配列は共変です。

つまり、 ifBが のサブタイプであり、AthenB[]も のサブタイプですA[]。そのため、 where が期待される場所を渡すことができるのと同じように、 B[]whereが期待される場所を渡すことができます。A[]BA

しかし、逆の場合は、次のような明示的なキャストが必要になります-

 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
于 2013-02-20T18:42:56.953 に答える