如何实现通用对的等于?

时间:2013-04-11 19:56:48

标签: java generics equals type-systems

为了好玩,我正在尝试用Java实现泛型Pair类。我遇到equals

时遇到问题
public class Pair<A, B>
{
    public final A _1;
    public final B _2;

    // ... unnecessary details left out ...

    public boolean equals(Pair<A, B> that)
    {
        return (_1.equals(that._1)) && (_2.equals(that._2));
    }

    @Override
    public boolean equals(Object o)
    {
        return (o instanceof Pair<A, B>) && equals((Pair<A, B>) o);
    }
}

但是,o instanceof Pair<A, B>似乎不起作用。那是为什么?

使用(o instanceof Pair) && equals((Pair<A, B>) o)向我发出警告。摆脱演员的<A, B>部分仍然给了我一个警告,我想也是有道理的。

这是否意味着Java无法阻止客户端比较具有不同类型参数的Pairs?

3 个答案:

答案 0 :(得分:6)

  

这是否意味着Java无法阻止客户端比较具有不同类型参数的Pairs?

是的,但重点 - equals应该适用于任意对象。你想要的是什么

@Override
public boolean equals(Object o)
{
    if (o instanceof Pair) {
       Pair<?, ?> pair = (Pair<?, ?>) o;
       return _1.equals(pair._1) && _2.equals(pair._2);
    }
    return false;
}

但是,只要AB具有equals的正确实施,即任意Object,就可以了。

答案 1 :(得分:2)

由于type erasure,您无法使用instanceof。您只能查看instanceof Pair 还有_1_2的内容是什么?真的?

答案 2 :(得分:0)

o instanceof Pair<A, B> 

不起作用,因为泛型在运行时不存在,因此instanceof不知道它们。