我有一个用 Java 1.4 编写的旧个人项目,我正在将其移植到版本 2 的 1.5(我仍然是新手)。除了向其添加新功能和重构代码之外,我还迁移到通用集合,注释等
有一段特定的代码我不知道如何更改为 1.5,并且不想在其上添加 @SuppressWarnings。事情是这样的:
if (value instanceof Comparable) {
isMatch = (((Comparable) value).compareTo(selectedValue) == 0);
} else {
//fallback to equals
isMatch = selectedValue.equals(value);
}
这只是一个简单的比较,在compareTo()中进行广泛的匹配,或者如果不是Comparable类型,则默认为普通的equals()。
我收到:Comparable is a raw type. References to generic type Comparable<T> should be parameterized
警告。
如何将上面的代码修改为1.5并清除警告。或者除了添加@SuppressWarnings别无选择?
最佳答案
具体来说,您会收到警告,因为您需要限定 Comparable
在强制转换中带有类型参数。这样你就有((Comparable<Type>)value)
,其中Type
是 selectedValue
的类型(的基类型) .
但是,即使您这样做,您仍然会收到警告。这次的问题是<Type>
编译时“消失”,这意味着无法确保该类实际上是 Comparable<Type>
。只能检查对象是否为 Comparable
。考虑以下测试应用程序:
class Type{
public int x = 0;
}
class Other implements Comparable {
public int compareTo(Type obj) {
return obj.x;
}
}
class Test {
public static void main(String[] args) {
Other obj1 = new Other();
Object value = obj1;
String selectedValue = "";
if (value instanceof Comparable) {
System.out.println(((Comparable<String>) value).compareTo(selectedValue));
}
}
}
代码编译时会出现警告,因为 while value
是 Comparable
它无法与 String
进行比较s。后者仍然更可取,因为您至少可以检查参数是否属于“预期”类型。
最后,您需要 @SuppressWarnings
.
请注意,如果您希望它适用于任何类。然后您也可以保持原样(或使用 Comparable<Object>
因为它们(在本例中)是等效的)。添加@SuppressWarnings
,显然。
关于Java 1.4 到 Java 1.5 - 重写代码并避免 @SuppressWarnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409124/