2016-05-18 12 views
0

メソッドequalsがクラスRectangleに属していると仮定した場合、objectが矩形であることが既に設定されている場合、objectを矩形としてキャストする必要があるのでしょうか?特定のクラスとして既に識別されているオブジェクトをキャストするのはなぜですか?

public boolean equals(Object object) 
{ 
    boolean equal; 
    if (object != null && this.getClass() == 
     object.getClass()) 
    { 
     Rectangle other = (Rectangle) object; 
     equal = (this.width == other.width) && 
     (this.height == other.height); 
    } 
    else 
    { 
     equal = false; 
    } 
    return equal; 
} 
+3

あなたが持っている 'if'節には言語構文が関係しないので。人間のようにコードを「読む」ことはありません。 – Kayaman

+0

静的型ob 'object'は' Object'です。 Javaで変数の静的型を変更することはできません。 – Turing85

+0

@ Kayamanはい、 'if'コードはオブジェクトがRectangleの場合にのみ実行されるため、なぜそれをRectangleとしてキャストする必要がありますか?私はそれと何の関係があるのか​​分かりません。 – yroc

答えて

1

this.getClass()== object.getClass()はオブジェクトが矩形であることを確認していませんか?

いいえ。このステートメントは、その操作に基づいてブール値を返します。オブジェクトが特定の型であることを「確実にする」ための唯一の方法は、変数をそのように初期化するか、またはその型にキャストしようとすることです。

これはコンパイラの観点から考えてください。コンパイラは、Objectオブジェクトが関数に渡されたときにそのオブジェクトを参照します。コンパイラにオブジェクトがRectangleであることを通知するものは何もありません。その型は決してRectangleに変更されません。

object.widthを実行しようとすると、コンパイラは「オブジェクトにはこのフィールドがありません」という理由で構文エラーが発生します。代わりに、オブジェクトがRectangleであることをコンパイラに明示的に伝える必要があります。次に、object.widthを使用できることがわかります。

コンパイラは、このようなインスタンスでは完全に無脳であるとみなし、明示的に指示していないことは知らないと考えてください。

+1

ありがとうございます。あなたの答えは本当に私の心の中で@ Kayamanが言っていたものが結晶化しました。 – yroc

3

コンパイラは、このobjectwidthと呼ばれるフィールドを持っていることを知りません。しかし、other a Rectangleである - したがって、コンパイラはそれぞれwidthheightフィールドがあることを知っている。

私はあなたが代わりに直接オブジェクトを使用して、あなたが得るエラーを見て、キャストをしないことをお勧めします。

関連する問題