为了好玩,我正在尝试用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?
答案 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;
}
但是,只要A
和B
具有equals
的正确实施,即任意Object
,就可以了。
答案 1 :(得分:2)
由于type erasure,您无法使用instanceof
。您只能查看instanceof Pair
还有_1
和_2
的内容是什么?真的?
答案 2 :(得分:0)
o instanceof Pair<A, B>
不起作用,因为泛型在运行时不存在,因此instanceof
不知道它们。