2017-11-05 13 views
1

抽象クラスでequalsメソッドをオーバーライドしようとしています。パラメータObject oがメソッドを継承したクラスのインスタンスであるかどうかと、equalsメソッドを継承したクラスと同じ型に型キャストするかどうかを調べる方法はありますか?すべてのサブクラスでequalsメソッドを使用するクラス

これはこれまで私が試したことですが、タイプjava.lang.Objectのエラー変数を受け取りました。 oが型キャストされていない理由はありますか? getOperand() メソッドは複合型を返します。

@Override 
public boolean equals(Object o){ 
    if (o.getClass() == this.getClass()){ 
     this.getClass().cast(o); 
     return (o.getOperand().equals(this.getOperand())); 
    } 
    else { 
     return false; 
    } 
} 
+0

"しかし、私はそれを動作させることができません" - >なぜですか?コンパイルエラーはありますか?実行時の例外ですか?予期しない動作?どうか明らかにしてください。また、['Class#isAssignableFrom(...)'](https://docs.oracle.com/javase/9​​/docs/api/java/lang/Class.html#isAssignableFrom- java.lang.Class-)。これは継承も処理するからです。 – Turing85

+0

'getOperand()'は何を返しますか?私は 'String'を推測しています。 'o.getOperand()。equals(this.getOperand())'を代わりに使用しますか? – CKing

+0

"getOperand()メソッドは複合型を返します。" - > @CKingは、これがシングルトンでない限り、あなたは '=='でそれらを比較する必要はありません。実際には、あなたがしていることを正確に知っていなければ、オブジェクトを '=='と比較するべきではありません(https://stackoverflow.com/questions/7520432/what-is-the-difference-between-vs-equals -in-java)。 – Turing85

答えて

2

以下を行う必要があります。コンパイラはObjectクラスは、このようなメソッドを持っていないので、getOperand方法を見つけることができるように、

  1. は、あなたのクラスの参照型へのキャストの結果を割り当てます。
  2. equalsメソッドを使用すると、==ではなくoperandの値が比較されます。
  3. instanceofを使用すると、ソリューションは混合型の等価をサポートします。 (Liskov Substitution Principleをお読みください。オプションあなたは混合型の平等をサポートしない場合)
  4. マークの対称性を(サポートするために、順序どおりにそれをオーバーライドからサブクラスを防ぐためにfinalとしてequals方法を。混合型をサポートしていない場合は必要ありませんx.equals(y)その後、y.equals(x)場合

    class EqualsTestSubClass extends EqualsTest { 
         //inherts the equals and getOperand methods.  
    } 
    
    class EqualsTestSubClass2 extends EqualsTestSubClass { 
         //inherts the equals and getOperand methods.  
    } 
    
    :そのまま等価)上記の変更により

    public abstract class EqualsTest { 
        public final boolean equals(Object o) {//make equals final to maintain symmetry 
         if (o instanceof EqualsTest) {//use instanceof 
          EqualsTest e = (EqualsTest)o;//cast and assign to EqualTest reference 
          return e.getOperand().equals(this.getOperand());//use equals here 
         } else 
          return false; 
         } 
        } 
    }  
    

は、サブクラスはequalsメソッドを継承することができ

あなたはその後、次のようにEqualsTestSubClassインスタンスのサブクラスであるEqualsTestEqualsTestSubClass2インスタンスの直接のサブクラスであるEqualsTestSubClassインスタンスの等価性をチェックすることができます

EqualsTest e1 = new EqualsTestSubClass(); 
EqualsTest e2 = new EqualsTestSubClass2(); 
System.out.println(e1.equals(e2)); 

:それは直接比較することで、より良いアイデアですがgetOperandを使用するのではなくequalsメソッド内のoperandフィールドは、getOperandがオーバーライド可能であるためです。

+0

equals()メソッドは抽象クラスにあり、EqualsTest eと同じ方法でインスタンスを作成できません。抽象メソッドを継承するクラスと同じ型に変数を一般的に型キャストする方法はありますか?私は抽象クラスを継承する4つのクラスを持つつもりです。 –

+1

@JohnRolding 'EqualsTest'が' abstract'になっても、答えには影響しません。 'equals'メソッドで' EqualTest'のインスタンスを作成していません。 EqualTestの 'equals'メソッドに渡された値をキャストし、それを' EqualTest'参照に代入しています。 – CKing

関連する問題