我应该使用问号类型参数还是抑制rawtypes警告?

时间:2015-07-12 07:16:16

标签: java eclipse generics

由于在Java中引入泛型类型参数(或类型参数),在Eclipse IDE中编写以下行将在类型Class上显示黄色波浪线:

Class myClass;

鼠标悬停时显示的警告如下,有两个选项(等等):

  

Class是原始类型。应该参数化通用类型Class<T>

     
      
  • 将类型参数添加到“Class
  •   
  • @SuppressWarnings'rawtypes'添加到“myClass
  •   

第一个选项产生此代码:

Class<?> myClass;

第二个产生了这个:

@SuppressWarnings("rawtypes")
Class myClass;

上述两个选项同样足以处理警告。

假设我们和Eclipse都不能推断泛型类型参数*;什么是更好的方法,在什么情况下,以及为什么?

*(尽管可以选择尝试这样做)

1 个答案:

答案 0 :(得分:2)

每个程序员都应遵守的一般规则:永远不要无缘无故地压制警告。如果您取消警告,您应该知道警告发生的原因以及为什么它不会出现问题。

在这种情况下,抑制rawtype警告的原因是支持在Java中不存在通用性时编写的遗留代码(参见Java语言规范4.8):

  

原始类型的使用仅允许作为兼容性的让步   遗留代码。在编写后的代码中使用原始类型   将通用性引入Java编程语言是   强烈气馁。 Java的未来版本可能是有可能的   编程语言将禁止使用原始类型。

因此它不适用于您的情况,您不应该禁止此警告。

对于通配符?,只有在您想为该变量分配各种类型时才应使用此选项。

例如,List<?> mylist允许您在列表中存储任何类型,而List<? extends Collection>允许您存储从Collection继承的任何类型以存储在列表中。一般规则是尽可能具体地说明允许的类型。这样,如果你不小心将一个对象添加到一个不适合它的List中,编译器就会通知你sonner。

因此,最好的方法是考虑如何使用myClass变量,如果可以声明它将保留哪种类型的对象,请将Wildcard替换为该类型。