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;
}
}
通过这种方法,我可以从eclipse获得两个不同的警告
ParameterizedType<T>.class
在语法上不正确(ParameterizedType<T>)
o是未经检查的演员阵容
你怎么能避开这个
# 1 楼答案
ParameterizedType<T>.class
在语法上不正确这是因为
.class
在运行时指的是.class
值,因为泛型是Java的编译时特性,类型参数被删除并替换为实际类型,所以语句在运行时没有意义,<T>
是完全冗余的请注意,相同的规则适用于
instanceof
运算符(即,您不能执行if (something instanceof SomeGenericClass<T>)
)(ParameterizedType<T>)
o是未经检查的演员阵容除非向下投射,否则无法将
Object
与ParameterizedType
进行比较。IDE正确地建议取消对实例的强制转换,但是为了比较实例,必须在某个时候进行向下转换。在这种情况下,在方法上方添加@SuppressWarnings("unchecked")
就可以了还请注意Strings in Java should not be compared with ^{}