У меня есть это упражнение:
public class TestClass{
public static void main(String args[]){
A[] a, a1;
B[] b;
a = new A[10];
a1 = a;
b = new B[20];
a = b; // 1
b = (B[]) a; // 2
b = (B[]) a1; // 3
}
}
class A { }
class B extends A { }
На мой взгляд, когда я пишу: a=b, я присваиваю объекту в b другую ссылку (a). На практике объект в b имеет две ссылки (a и b). Но для правила наследования подкласс также относится к типу суперкласса, но суперкласс не является также типом подкласса.
Как ссылка на суперкласс (а) может быть назначена типу подкласса (б)?
И это касается и последующего присвоения.
На мой взгляд, если бы я написал: b=a, то код компилировался бы без проблем, но для присваивания a=b должна быть ошибка компиляции.
Почему это задание правильное?
Отформатировано для вас
"In practice, the object in b has two references (a and b)" -- нет, это одна ссылка, содержащаяся в двух переменных
b = (B[]) a1; // 3 это не удастся. Он скомпилируется, но выдаст исключение, поскольку вы пытаетесь преобразовать массив A в массив B.
"How can a superclass reference (a) be assigned to a subclass type (b)?" -- этого не происходит, за исключением ошибочной строки кода.




Предположим, что класс A — это класс Animal, а класс B — класс Dog. Вы можете создать животное, которое является собакой (a = b), потому что собаки — это животные (подкласс). Но это не работает наоборот (b = a), потому что животное может быть чем-то большим, чем собака, например кошка, поэтому вы не можете назначить кошку собакой. Итак, чтобы сделать это, вы должны были бы явно указать, что животное должно быть собакой (b = (собака) a).
посмотрите этот пример: Object []oo=new Object[1]; Строка []ss = новая строка [3]; оо=сс; //хорошо, потому что String тоже объект. сс=оо; // ошибка компиляции, потому что объект не является строкой
ss = oo даст вам ошибку компиляции, потому что oo может быть не строковым объектом. Поэтому, если вы примените его: ss = (String []) oo, он скомпилируется нормально.
Вы не новичок - почему вы неправильно форматируете свой опубликованный код?