編集:より明確にするために、これはあなたの問題です:
これ:
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 はこれが事実であることを認識し、(Inigo Montoya の言葉をずさんに引用すると)「それはあなたが考えていることを意味するとは思わない」と伝えます。
二次的な問題として、Java は厳密に型指定されています。あなたが言っているような構文を許可するかもしれませんが、このifステートメントの直後に、realOtherの絶対最終型が必要です。あなたのifステートメントは、realOtherが長方形または正方形として扱われることになっていたかどうかわからないため、Javaの脳を完全に壊します。
長方形に 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);
}
言い換えれば、関連するオブジェクトを操作する方法は、オブジェクトのメソッドを呼び出す必要がある場合にのみ特定のオブジェクトを使用して、それらをより抽象的なオブジェクトとしてできるだけ長く残しておくことです。
正しくコーディングすれば、ほとんどの場合、より抽象的なものを使用でき、具体的なものはほとんど使用できません。square と rect の場合、これは明らかではありません。square/rect はかなりずさんな問題であり、OO プログラミングで行う必要があるいくつかの難しい決定の例として使用されますが、実際にはほぼ常にうまくいきます。キャストする必要はほとんどありません...