fre*_*low 3 java generics type-systems 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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,o instanceof Pair<A, B>似乎没有用.这是为什么?
使用(o instanceof Pair) && equals((Pair<A, B>) o)给了我一个关于演员的警告.摆脱<A, B>演员的部分仍然给我一个警告,我想也有一些道理.
这是否意味着Java无法阻止客户端比较具有不同类型参数的Pairs?
这是否意味着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;
}
Run Code Online (Sandbox Code Playgroud)
但这应该没问题,只要A并且B有适当的实现equals,任意Objects.