只是为了好玩,我正在尝试用 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)
给我一个 Actor 警告。摆脱 <A, B>
类型转换上的部分仍然给我一个警告,我想这也是有道理的。
这是否意味着 Java 无法阻止客户端比较具有不同类型参数的 Pair?
最佳答案
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
有适当的 equals
实现,它可以接受任意 Object
s.
关于java - 如何为泛型对实现 equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957729/