Редактировать: чтобы быть более понятным, это ваша проблема:
Это:
if (other instanceof Square)
Square realOther = (Square) other;
else
Rectangle realOther = (Rectangle) other;
- это то же самое, что и это:
if (other instanceof Square) {
Square realOther = (Square) other;
} else {
Rectangle realOther = (Rectangle) other;
}
Обратите внимание, что вы никогда ничего не делаете с realOther. Вы определяете его там, но, поскольку он ограничен этим набором скобок, вы выбрасываете его, как только нажимаете на закрывающую скобку.
Отсутствие скобок не помогает, тот факт, что это оператор (после if) делает его независимым блоком кода, и как только этот блок выходит, realOther отбрасывается.
Java признает, что это так, и говорит вам (небрежно цитируя Иниго Монтойя): «Я не думаю, что это означает то, что вы думаете, что это значит».
Вторичная проблема, Java строго типизирована. Даже если он может разрешить синтаксис, как вы говорите, сразу после этого оператора if он должен иметь абсолютный конечный тип для realOther. Ваше заявление if полностью сломало бы мозг Java, потому что он не знал бы, должен ли realOther рассматриваться как прямоугольник или квадрат.
Предположим, что прямоугольник имеет метод setWidth и setHeight (а квадрат только что имеет setHeight). После этого оператора IF Java должна позволять вам вызывать setWidth или нет? Java ДОЛЖНА знать эти вещи во время компиляции (если нет, нам не понадобится приведение).
другое редактирование:
Чтобы исправить это, вы используете это:
// class Rectangle extends Square
// Both implement setHeight, Rect also implements setWidth.
public void reSize(Square other, int h, int w) {
other.setHeight(h);
if (realOther instanceof Rectangle) {
((Rectangle)realOther).setWidth(w);
}
Другими словами, вы должны работать со связанными объектами так, чтобы они оставались как более абстрактный объект как можно дольше, используя только конкретные объекты, когда вам нужно вызвать метод для этого объекта.
Если вы правильно написали код, вы почти всегда можете использовать более абстрактные и редко использовать конкретные. С квадратом и прямоугольником это неочевидно, квадрат / прямоугольник - довольно неряшливая проблема и используется в качестве примера некоторых трудных решений, которые вы должны принять с помощью ОО-программирования, но это действительно работает почти всегда - я очень редко приходится кастовать вообще ...