我想在这个类中重写equals()方法。我在覆盖equals()方法的同时遵循通常的规则但是我将对象类型转换为我的类类型
但是在我的equals()方法中,只有当对象具有相同的泛型类型时,我才想返回true。
如何在equals()方法中检查实例的运行时类型?
这是我的代码:
public class GenericsRunTimeType<T> {
private T foo;
public GenericsRunTimeType(T foo){
this.foo = foo;
}
@Override
public boolean equals(Object obj){
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
// Before doing this I want to test if obj and this are of the same generic type
GenericsRunTimeType other = (GenericsRunTimeType) obj;
if(other.equals(obj))
return true;
else
return false;
}
}
答案 0 :(得分:7)
在您的情况下,您可以检查:
foo.getClass().equals(other.foo.getClass())
这是因为您的班级已经有班级T
的成员。但是在通常的情况下,当你没有这样的成员时,请看看@Rohit Jain所做的回答。 (1)
答案 1 :(得分:5)
一种选择是使用 Reflection ,但我认为这是我的最后手段。
我更喜欢的另一个选项是在构造函数中传递Class<T>
参数,并将其存储在字段中:
private T foo;
private Class<T> clazz;
public GenericsRunTimeType(T foo, Class<T> clazz){
this.foo = foo;
this.clazz = clazz;
}
然后在equals
方法中,按比例进行比较:
if (this.clazz == ((GenericsRunTimeType)obj).clazz) {
System.out.println("Same type");
}
答案 2 :(得分:2)
我正在给出另一个方向:你真的需要检查TYPE PARAMETER的相等性吗?
假设您的示例中的foo
应该属于相等,通常equals()
方法应该是
public boolean equals(Object obj){
if (this == obj)
return true;
if (obj == null)
return false;
if (!obj instanceof GenericsRunTimeType)
return false;
GenericsRunTimeType other = (GenericsRunTimeType) obj;
return (this.foo.equals(obj.foo)) // !Here
// can be better wrote as foo==obj.foo || (foo != null && foo.equals(obj.foo))
// I wrote in a simpler form just to give you the idea
}
两个foo
是否属于同一类型,通常由foo
的equals()负责处理。如果你不关心这两个foo
是否相等,那你为什么要关心两个foo
是否属于同一类型?
当然还有其他选择,例如其他答案建议的内容,您从foo
获取类型并比较它们或传入另一个Class
对象。但是我认为在大多数情况下可能没有必要。