0

文字列で識別されるオブジェクトのequals(Object o)メソッドをオーバーライドしています。

class User {
@Override
public boolean equals(Object o) {       
    return o != null && o.hashCode() == this.hashCode();
}

@Override
public int hashCode() {
    return id.hashCode();
}
}

oただし、メソッドでtrueを返す前に、がのサブクラスであるかどうか、thisまたはその逆かどうかも確認したいと思います。equals()

最初のケースでは使用できますif (o instance of User)が、他の方法でチェックするにはどうすればよいですか?

ありがとう

編集:私はそれを正しく説明していないので、私は完全な問題を説明するつもりです:

私はクラスを持っています

public abstract class UniqueIdentifiedObject<E> {
    private E id;

    protected UniqueIdentifiedObject(E id) {
        super();
        this.id = id;
    }

    public E getId() {
        return id;
    }

    @Override
    public boolean equals(Object o) {
        return o != null && o.hashCode() == this.hashCode();
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }

}

このクラスは、要素によって一意に識別される場合にオブジェクトとともに継承するという考え方です。たとえば、アプリのユーザーが整数で識別される場合は、次を使用します。

class User extends UniqueIdentifiedObject<Integer>

と映画のために

class Movie extends UniqueIdentifiedObject<Integer>

このUniqueIdentifiedObjectの実装の問題はequals()、id = 1の映画で呼び出し、id=1のユーザーでtrueを返すことです。

どうすればこれを解決できますか?

4

2 に答える 2

4
this.getClass().isAssignableFrom(o.getClass());

Class.isAssignableFrom

javadocから:

このClassオブジェクトによって表されるクラスまたはインターフェースが、指定されたClassパラメーターによって表されるクラスまたはインターフェースと同じであるか、スーパークラスまたはスーパーインターフェースであるかを判別します。その場合はtrueを返します。それ以外の場合はfalseを返します。このClassオブジェクトがプリミティブ型を表す場合、指定されたClassパラメーターがまさにこのClassオブジェクトである場合、このメソッドはtrueを返します。それ以外の場合はfalseを返します。

したがって、上記は、によって返されるthisクラスが、返されるクラスのスーパークラスであることを確認しますo

于 2012-10-16T10:36:28.997 に答える
0

まず、コードはほとんどの場合に機能しますが、誤検知を避けるために、等式に基づいてequals()を計算することをお勧めします。

「Class.isAssignableFrom」を使用して動的タイプを確認できます。たとえば、

   this.getClass().isAssignableFrom(other.getClass())

otherが同じクラスであるか、「this」のサブクラスであるかを教えてくれます。(これは他のスーパークラスでなければならないので)

私はここでそれをする必要はないと思いますが

「this」がUserのサブクラスであることを保証できます。また、otherが同じタイプであることを保証できる場合は、そのままで機能するはずです。

したがって、あなたの場合、メソッドは次のようになります。

class User {
@Override
public boolean equals(Object o) {
   if (o==null) {
      return false;
   }
   if (o instanceof User) {
     return (o.id==null && id==null ) || (o.id.equals(id));
   }
}
@Override
public int hashCode() {
    return id.hashCode();
}
}
于 2012-10-16T10:42:36.530 に答える