3

只是为了好玩,我试图在 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 与不同类型的参数进行比较?

4

3 回答 3

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采取任意Objects。

于 2013-04-11T19:59:43.733 回答
2

instanceof由于类型擦除,您不能像以前那样使用。您只能检查instanceof Pair. 那
又是怎么回事?真的吗?_1_2

于 2013-04-11T19:58:55.980 回答
0
o instanceof Pair<A, B> 

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

于 2013-04-11T19:59:13.513 回答