编程语言
首页 > 编程语言> > java – 如何为泛型对实现equals?

java – 如何为泛型对实现equals?

作者:互联网

只是为了好玩,我正在尝试用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);
    }
}

然而,对实例< A,B>似乎不起作用.这是为什么?

使用(o instanceof Pair)&&等于((对< A,B>)o)给我一个关于演员的警告.摆脱< A,B>演员的一部分仍然给我一个警告,我想也有一些道理.

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

解决方法:

Does that mean Java cannot prevent clients from comparing Pairs with different type arguments?

是的,但这就是重点 – 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;
}

但是这应该没问题,只要A和B有适当的等于实现任意对象的实现.

标签:java,equals,generics,type-systems
来源: https://codeday.me/bug/20190725/1534859.html