2010-09-14 5 views
-7

Если у меня есть class A { и class B extends A { будетПодтипы Массивы

B[] b = new B[1]; 
b[0] = new B(); 
System.out.println(b instanceof A[]); 

распечатывают истинным или ложным?

+15

Что произошло, когда вы пробовали? –

+7

У вас нет доступа к компилятору Java или к чему-то еще? –

+0

Глупый меня. Слишком ленив, чтобы создать новый основной класс = ( –

ответ

14

JLS states что если B назначается A, то да, B [] присваивается A [].

Это открывает дверь к серьезным последствиям, хотя, продемонстрированные этим кодом:

class A {} 
class B extends A {} 
class C extends A {} 

//... 
B[] bs = new B[2]; 
A[] as = bs; 
as[0] = new C(); //runtime error 
B b = bs[0]; 

Этот код compiles but fails at runtime. Мы называем это отсутствием безопасности типов.

-4

Неверный.

Массивы не выполняют те же правила, что и обычные объекты.

+8

Ну, у вас был шанс 50/50, извините, что это не сработало для вас. –

+2

Вы, вероятно, ошибочно принимаете массивы с помощью дженериков. –

+0

Я помню последствия для безопасности типа и не помнил, как это было обработано. – Darron

1
// A.java 
public class A {} 

// B.java 
public class B extends A {} 

// Test.java 
public class Test { 
    public static void main(String[] args) { 
     B[] b = new B[1]; 
     b[0] = new B(); 
     System.out.println(b instanceof A[]); 
    } 
} 

При запуске:

> javac *.java && java Test 
true 
Смежные вопросы