2011-07-09 14 views
10

私はデータ構造に関する本を調べています。現在私はグラフ上にあり、下のコードはグラフの頂点部分のためのコードです。javaなぜメソッドの入力パラメータが等しいかどうかオブジェクト

class Vertex<E>{ 
    //bunch of methods 

    public boolean equals(Object o){ 
     //some code 
    } 
} 

私はこれが私のコンパイラは、パラメータの種類をチェックし、ちょうど任意のオブジェクトは、それを送信することができません文句equalsメソッドを実装してみてください。また、なぜ、そのパラメータがオブジェクトの代わりに頂点であってはならないのか、私はちょっと奇妙に思えます。作者がこれを行う理由、またはこれがいくつかの間違いや古くなった例ですか?

+0

のjavadocは、あなたが、ここに*正確な*コンパイラのメッセージをしてください繰り返しでしたか? –

+0

頂点の代わりにオブジェクトを受け入れる理由はないとわかります。 – Jeremy

+0

私はそれをエラーではなく警告と呼びます。 – adarshr

答えて

13
@Override 
public boolean equals(Object obj) 
{ 
    if(obj == null) return false; 
    else if (!(obj instanceof Vertex)) return false; 
    else return // blah blah 
} 
+1

まず、objがnullでないことを確認することができます。 –

+0

@ Hovercraft固定Eels固定、ありがとう –

+0

十分に公正、1 + –

3

equalsはObjectから継承されたメソッドであり、任意のオブジェクトを取得して他のオブジェクトと等価であるかどうかをテストできるように柔軟に定義されています。他の方法ですか?

編集1

jhlu87からコメント:
ので、良好な形状は、頂点の入力パラメータを有する等しい方法を書くことではないのですか?

あなたは等号を含め、いずれの方法に独自のオーバーロードを作成することが歓迎されているが、名前を変更することなく、そうすることは、あなたの等号はObjectから継承するものであることを前提となり多くの人々を混乱危険にさらす可能性があります。それが私のコードであり、より具体的なequalsメソッドが必要だった場合は、混乱を避けるためにちょうど "equals"と少し違っています。

+0

入力パラメータが頂点であるequalsメソッドを記述するのは良い形式ではありませんか? – jhlu87

+0

@jhlu:参照してください**編集1 ** –

+2

誰でも私の答えを投票しました:少なくともコメントを残してください。 –

10

equals(Object)は、ルートオブジェクトで定義されたメソッドです。署名と正確に一致しない場合は、2つのオブジェクトが等しいかどうかをチェックするときにオブジェクトのバージョンが呼び出されます。あなたが望むものではありません。

おそらく、正確な時間を使用できる他の方法(コンパレータなど)があります。これは、これらのAPIがJava 5で汎用されていたからです。equalsは、2つの別々の型でequalsを呼び出すことが有効であるため、同じではありません。 falseを返しますが、有効です。

2

このメソッドはジェネリック前が存在していたので、それはですので、後方compatabitityのためには、このように滞在する必要があります。

タイプを課すための標準的な回避策は次のとおりです。

return obj instanceof MyClass && <some condition>; 
0

著者は等号をオーバーライドしているので、それはあります。 Equalsはjava.lang.Objectで指定され、すべてのクラスが継承するものです。

java.lang.Object

+0

equals(およびhashCode)を正しく実装する方法はこちらをご覧くださいhttp://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Kristian

関連する問題