我有以下课程。
public class Combination<E extends Comparable> {
private List<E> objects;
// ...
@Override
public boolean equals(Object o) {
// ...
}
@Override
public int hashCode() {
// ...
}
}
我正在覆盖equals
和hashCode
方法,因此我可以轻松创建Set<Combination>
并且没有任何多余的组合。
问题是......因为我的班级有通用类型,我如何在equals
方法中测试这种类型?例如,Combination<Integer>
与Combination<Double>
或Combination<Car>
不同。但是如何在equals方法中测试呢?
理想情况下,我可以覆盖equals方法以接受Combination<E>
参数。一个简单的解决方案是重载equals方法吗?例如,
@Override
public boolean equals(Object o) {
// This method will only be called when o is not an instance of Combination<E>.
// So in this case return false.
return false;
}
public boolean equals(Combination<E> cmb) {
// Compare the two combinations here.
// <code> ...
}
答案 0 :(得分:4)
这里的解决方案是信任成员对象的equals方法只匹配正确的类型。你做需要在这里使用instanceof,你不应该使用rawtypes,但它应该看起来像
@Override public boolean equals(Object o) {
if (o instanceof Combination) {
Combination<?> c = (Combination<?>) o;
return objects.equals(c.objects);
}
return false;
}
这是类型安全的,并且工作正常,并且信任List
(及其元素)以正确实现自己的equals方法。
答案 1 :(得分:2)
你完全不能像在Java中提出的那样:
equals()
不能使用与Object不同的参数,即重载,而不是覆盖 可以轻松实现类似的语义功能。您应该委托objects.equals()
from
您的equals()
方法,如果对象传入组合类,这将有效对象正确实现equals()
和hashCode()
答案 2 :(得分:1)
你过分复杂了平等的概念。只需从equals方法中分解另一个实例,并比较每个成员的有效状态。
public class Foo<T> {
T field;
public Foo(T f){
field = f;
}
@Override
public boolean equals(Object o){
// leaving off the standard instanceof checking
Foo other = (Foo)o;
return field.equals(other.field);
}
}