【发布时间】:2019-03-09 17:38:53
【问题描述】:
我想解决这个编译器警告:
unchecked call to compareTo(T) as member of the raw type java.lang.Comparable
我的目标是使用以下方法比较两个未知(背景)类型的 java.lang.Object 对象。
public static boolean Compare(Object o1, Object o2) {
//check if both classes are the same
if(!o1.getClass().equals(o2.getClass())) {
return false;
}
if(Comparable.class.isAssignableFrom(o1.getClass())
&& Comparable.class.isAssignableFrom(o2.getClass())) {
//only if both objects implement comparable
return Comparable.class.cast(o1).compareTo(Comparable.class.cast(o2)) == 0;
}
//other comparison techniques...
}
我知道问题在于该方法将两个对象都转换为Comparable (Comparable<Object>),但Object 没有实现Comparable。
代码本身可以工作,但编译器在使用 -Xlint:unchecked 参数时会抛出警告。
目标:
- 删除编译器警告
- 避免出现其他“未经检查”的警告
- 避免使用@SupressWarning
- 保持比较方法非泛型
【问题讨论】:
-
你不能。 SuppressWarning 正是为此:编译器警告你你正在做一些它无法检查它是否是类型安全的事情。要么让你的代码类型安全,要么告诉编译器:我知道,我知道,请相信我。这就是 SuppressWarning 的用途。不过,您应该尊重 Java 约定。这很简单,而且不涉及禁止警告。
-
如果你不知道这两个类是否实现了
Comparable,那么比较它们是没有意义的。顺便说一句,看起来你尝试实现equals。 -
@JB Nizet - 谢谢,看来我会使用 SupressWarning。
-
@Lutz Horn - 我没有实现 equals,我只是想比较两个使用反射动态调用的方法的结果。
标签: java generics comparable unchecked