Java“unchecked调用compareTo(T)作为原始类型java.lang.Comparable的成员”

我正在尝试将排序列表实现为Java中的简单练习。 为了使它具有通用性,我有一个add(Comparable obj)所以我可以在任何实现Comparable接口的类中使用它。

但是,当我在代码中的任何地方使用obj.compareTo(...)时,我从编译器中获取"unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable" (使用-Xlint:unchecked选项) )。 代码工作正常,但我无法弄清楚如何摆脱这个烦人的消息。

任何提示?

实质上,此警告表示Comparable对象无法与任意对象进行比较。 Comparable是一个通用接口,其中类型参数T指定可与此对象进行比较的对象的类型。

因此,为了正确使用Comparable ,您需要使您的排序列表通用,以表示您的列表存储可以相互比较的对象的约束,如下所示:

 public class SortedList> { public void add(T obj) { ... } ... } 

使用像Comparable这样的接口作为方法参数不会使您的类具有通用性,声明和使用generics类型参数就是如何使它成为通用的。

快速回答:您收到警告是因为您使用Comparable (一个通用接口)作为原始类型,而不是给它一个特定的类型参数,比如Comparable

要解决此问题,请通过指定类型参数使add()generics:

 > add(T obj) { ... } 

但是这个快速修复不会解决您的课程不安全的一般问题。 毕竟,列表中的所有对象不应该是同一类型的吗? 此add方法允许您将不同的类型放入同一列表中。 当您尝试比较异构类型时会发生什么(如何将Object实例与Number实例或String实例进行比较)? 您可以依赖类的用户来做正确的事情,并确保他们只在列表中添加一种东西,但是generics类将让编译器强制执行此规则。

更好的方法:正确的解决方案是您的排序列表类可能应该是通用的,就像java.util的其他集合类一样。

你可能会喜欢这样的东西:

 public class SortedList> implements Iterable { ... public void add(T item) { ... } public Iterator iterator() { ... } ... } 

请注意,当类是通用的时, add方法使用类forms类型参数,而不是声明其自己的forms类型参数。

网上应该有很多关于如何创建generics类的教程,但这里有一个简单的例子:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002

 class Pair { private X first; private Y second; public Pair(X a1, Y a2) { first = a1; second = a2; } public X getFirst() { return first; } public Y getSecond() { return second; } public void setFirst(X arg) { first = arg; } public void setSecond(Y arg) { second = arg; } } 

您需要“检查”或定义Comparable对象,如下所示:

 add(Comparable obj)