比较两个<! - ?,? - >的正确方法是什么?

时间:2013-11-26 11:42:12

标签: java

比较两个Pair<?,?>的正确方法是什么?

我使用此代码,但我不是百分之百确定吗? 你可能知道另一个更好的解决方案吗?

public boolean equals(Object other) {
        if (other instanceof Pair<?,?>) {
            Pair<?, ?> otherPair = (Pair<?, ?>) other;
            return  equalsPart(this._first, otherPair._first) &&  equalsPart(this._second, otherPair._second);
        }
        return false;
    }


public boolean equalsPart(Class<?> one, Class<?> two) {
    return ((one== two || (one!= null && two != null && one.equals(two))));
}

2 个答案:

答案 0 :(得分:1)

public boolean equals(Object other) {
        if(this == other)
            return true;

        if (!(other instanceof Pair)) {
            return false;
        }


        Pair<?, ?> otherPair = (Pair<?, ?>) other;

        return Equality.equals(this.first,otherPair._first) &&
               Equality.equals(this._second, otherPair._second);
    }


    class Equality{
         public static boolean equals(Object first, Object second){ 
              return first == null ? second == null : first.equals(second);
         }
    }

你会发现equals()的许多图书馆都遵循这种习惯用法。 equals()的前提条件检查和快速失败方法。

创建了一个新的实用工具Equality,用于进一步的课程,提高了可读性,并提供了正确的null检查。

答案 1 :(得分:1)

我相信以下是对此的准确解决方案。由于Java和OP都没有提供Pair<?, ?>的定义,因此我在下面列出了the class I actually use的完整定义。该代码包含hashCode的完整性定义。

public class Tuple2<T1, T2> {

    private final T1 item1;
    private final T2 item2;

    public Tuple2(T1 item1, T2 item2) {
        this.item1 = item1;
        this.item2 = item2;
    }

    public final T1 getItem1() {
        return item1;
    }

    public final T2 getItem2() {
        return item2;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        else if (!(obj instanceof Tuple2<?, ?>)) {
            return false;
        }

        Tuple2<?, ?> other = (Tuple2<?, ?>)obj;
        return Tuple.equals(this.item1, other.item1)
            && Tuple.equals(this.item2, other.item2);
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + (this.item1 != null ? this.item1.hashCode() : 0);
        hash = 79 * hash + (this.item2 != null ? this.item2.hashCode() : 0);
        return hash;
    }

}