Рассмотрим следующий код:Явная литья и переназначение
class A{}
class B extends A{
public static void main(String args[]){
A exampleA = new A();
B exampleB = new B();
exampleB = exampleA; // compile error}
Я понимаю, почему это приводит к ошибке, потому что вам нужно явное приведение. Тем не менее, я не понимаю, почему я получаю ошибку компиляции с помощью следующего кода:
class A{}
class B extends A{
public static void main(String args[]){
A exampleA = new A();
B exampleB = new B();
exampleA = exampleB;
exampleB = exampleA; // compile error
С моей точки зрения, указатель exampleA теперь указывает на тот же объект, как это делает exampleB, который является объектом класса В Кроме того, из-за переназначения примера указателя A я интерпретирую последнюю строку кода как пример B = exampleB; Компилятор не согласен, и я не могу думать как компилятор. Может кто-нибудь сказать мне, почему я получаю сообщение об ошибке?
Я также использовал метод getClass для обоих классов, и вывод показывает, что оба они действительно указывают на один и тот же объект. Поэтому я смущен.
Я новичок в программировании и хотел бы узнать больше о том, как компилятор думает. Помимо ответа на вопрос, любые советы по книгам или другим источникам для различения между компилятором и логикой выполнения будут очень полезны!
Обратите внимание, что я знаю, как решить второй блок кода, который просто выполняет явное литье.
«потому что вам нужно явное приведение» Вы бы получить 'ClassCastException' во время выполнения, если вы сделали это: все' 'B's являются A's, но не все' 'A's являются B' s. –
Компилятор Java не отслеживает значения через ваш код: он просто берет их по номиналу. Вы просто не можете назначить 'A'' B', не отбрасывая его; и это может завершиться неудачно во время выполнения, если на самом деле это не 'B'. –
Да, я забыл об этом, я бы получил ClassCastException во время выполнения, потому что во время инициализации они не связаны друг с другом. Тем не менее, это не отвечает на мой вопрос, почему я получаю ошибку компиляции. Почему компилятор не видит этого? @AndyTurner: ваш второй комментарий частично ответил на мой вопрос. Спасибо. Как узнать, как изолировать логическое отслеживание от того, что вы называете временем лица? Любые книги, которые помогают мне в этом? – AJavaStudent