У меня возникли проблемы с пониманием того, что на самом деле происходит, когда я объявляю массив в следующем коде.
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()
), Первоначально я думал, что если произошла одна ошибка, другая не может произойти. Я хотел сравнить между двумя ошибками и более подробное объяснение, чем просто правила полиморфизма.