У меня возникли проблемы с пониманием того, что на самом деле происходит, когда я объявляю массив в следующем коде.
class Type1 {
}
class Type2 extends Type1 {
public void method2() {
}
}
class Test {
public static void main(String[] args) {
Type1[] x = new Type2[2];
x[0] = new Type1(); // runtime error
x[1] = new Type2();
x[1].method2(); // syntax error
}
}
Я думал, поскольку правая часть объявления массива является new Type2[2] что массив будет состоять из ссылочных переменных типа Type2. Если это так, первая ошибка имеет смысл, потому что у меня нет подтипа, относящегося к супертипу.
Однако почему вторая ошибка возникает после двух строк? Разве method2() известен по типу 2, поэтому метод известен ссылочной переменной? Кажется, это потому, что Type1 не знает method2, значит, это означает, что массив состоит из ссылочных переменных типа Type1? Если это так, то почему возникает первая ошибка, поскольку она больше не является подтипом, относящимся к супертипу?
Кроме того, почему первая ошибка является ошибкой во время выполнения, а другая - синтаксической ошибкой?
Пожалуйста, обратите внимание, что я только на своем втором курсе программирования, поэтому моя терминология может быть немного отключена.
Изменение: вопрос здесь не отвечает на мой вопрос, потому что он не отвечает, почему элемент массива типа x не может вызвать method2() хотя элемент x Type 2. Мой вопрос отличается из-за этого и потому, что в моем вопросе также спрашивается, почему первая ошибка возникает при возникновении второй ошибки (почему элемент x не может ссылаться и объект типа Type1 и в то же время не может вызвать method2()), Первоначально я думал, что если произошла одна ошибка, другая не может произойти. Я хотел сравнить между двумя ошибками и более подробное объяснение, чем просто правила полиморфизма.