2013-02-20 3 views
0

Я знаю, что Java - это статический язык, и есть динамическая проверка, когда дело доходит до массивов: , но я не могу понять, почему это происходит, может кто-нибудь объяснить мне этот пример в оба случая, когда: A [] является подтипом B [], или B [] является подтипом A []? что не получится и почему?Являющиеся подтипы полиморфизма Java друг другу

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

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

Попробуйте его с помощью компилятора. –

+0

Какой результат вы получаете и какой результат вы ожидаете? – Achrome

+1

«но я не могу понять, почему это происходит» ... Что происходит? –

ответ

2

Массивы на Java - covariant.

Что означает, если B является подтилем A, тогда 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 
+0

, поэтому этот код должен работать, когда B является подтипом A?! – nabil

+0

Да, это правильно. –

Смежные вопросы