铸造在Java
问题描述:
类型参数说我有一类这样的:铸造在Java
class ParameterizedType<T>{
public boolean equals(Object o){
if (ParameterizedType<T>.class.isInstance(o)){
ParameterizedType<T> other = (ParameterizedType<T>) o;
return this.toString() == other.toString();
}
return false;
}
}
我可以在这样的方法从日食两个不同的警告。
ParameterizedType<T>.class
不是语法正确(ParameterizedType<T>)
o是一个未经检查的投
怎会解决此得到什么?
答
-
ParameterizedType<T>.class
不是语法正确
这样做的原因是,随着.class
您提到在运行时由于仿制药的.class
值是Java的编译时间功能和类型参数获得擦除并替换为实际类型,那么在运行系统中该语句没有意义,并且<T>
完全是多余的。
注意的是,同样的规则适用于instanceof
运营商(即你不能做if (something instanceof SomeGenericClass<T>)
)
-
(ParameterizedType<T>)
o是一个未经检查的投
有没有除非向下转换,否则将Object
与ParameterizedType
进行比较。 IDE正确地表明该演员阵容没有被选中,但为了比较这些实例,你必须在某个时刻向下倾倒。在这种情况下,在该方法之上添加@SuppressWarnings("unchecked")
将会很好。
@ kocko有正确的信息。为了解决这个问题,你需要使用@SuppressWarnings(“unchecked”)。将鼠标悬停在警告上时,Eclipse会提供有用的提示。通过这样做,你告诉自己和其他开发人员,是的,我承认这是没有检查的,但我需要这样做。 – markbernard
你想通过比较字符串引用来实现equals吗?无论如何,通过引用'toString'方法来计算'equals'是个坏习惯,但是将字符串与'=='比较是一个[严重错误](http://*.com/questions/513832/how-do-i -compare串式的Java)。 – RealSkeptic