Java 1.4 到 Java 1.5 - 重写代码并避免 @SuppressWarnings

标签 java generics refactoring

我有一个用 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) ,其中TypeselectedValue 的类型(的基类型) .

但是,即使您这样做,您仍然会收到警告。这次的问题是<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 valueComparable它无法与 String 进行比较s。后者仍然更可取,因为您至少可以检查参数是否属于“预期”类型。

最后,您需要 @SuppressWarnings .

请注意,如果您希望它适用于任何类。然后您也可以保持原样(或使用 Comparable<Object> 因为它们(在本例中)是等效的)。添加@SuppressWarnings ,显然。

关于Java 1.4 到 Java 1.5 - 重写代码并避免 @SuppressWarnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409124/

相关文章:

java - 来自android的REST调用中的Class Cast Exception

java - 如何在 Windows 下通过 Java 使用 NaCl

c# - 在 "public T SomeMethod<T>(string item) where T : new();"中有 new() 的用例是什么

java - 通用方法参数 - Java

iphone - iOS 应用程序中的代码重用

java - 无法在数组类型 (Class) MitarbeiterListe[] 上调用方法 getSize()

java - String 不断调用 NullPointerException,不确定它从哪里获取

java - 扩展 List 及其泛型

c++ - 如何重构这个 while 循环以摆脱 "continue"?

c# - 如何将 Specflow 步骤标记为 'Obsolete' 以支持渐进式、向后兼容的重构