使用generics类实现Comparable

我想定义一个实现通用Comparable接口的类。 在我的课堂上,我还定义了一个generics类型元素T 为了实现接口,我将比较委托给T 这是我的代码:

 public class Item<T extends Comparable> implements Comparable { private int s; private T t; public T getT() { return t; } @Override public int compareTo(Item o) { return getT().compareTo(o.getT()); } } 

当我尝试编译它时,我收到以下错误信息:

 Item.java:11: error: method compareTo in interface Comparable cannot be applied to given types; return getT().compareTo(o.getT()); ^ required: T#1 found: Comparable reason: actual argument Comparable cannot be converted to T#1 by method invocation conversion where T#1,T#2 are type-variables: T#1 extends Comparable declared in class Item T#2 extends Object declared in interface Comparable 1 error 

任何人都可以告诉我为什么以及如何解决它?

Item (没有任何类型参数)是原始类型 ,因此:

  1. 我们可以将任何类型的Item传递给Item.compareTo 。 例如,这将编译:

     new Item().compareTo(new Item()) 
  2. 方法o.getT()返回Comparable而不是T ,这会导致编译错误。

    在第1点下的示例中,在将Item传递给Item.compareTo ,我们将错误地将Integer传递给String.compareTo 。 编译错误阻止我们编写执行该操作的代码。

我想你只需要删除原始类型:

 public class Item> implements Comparable> { ... @Override public int compareTo(Item o) { return getT().compareTo(o.getT()); } } 

您在类定义中使用原始类型( Item是通用的,但您省略了类型参数 ),将其更改为:

 class Item> implements Comparable> 

(注意最后的

然后还必须更改compareTo方法:

 public int compareTo(Item o) { // again, use generics return getT().compareTo(o.getT()); } 

我认为,这更有意义。 我编译并测试了以下内容:

 class Item> implements Comparable { private int s; private E t; public E getE() { return t; } @Override public int compareTo(E e) { return getE().compareTo(e); } public int compareTo(Item other) { return getE().compareTo(other.getE()); } } 

请注意,您现在需要有两个compareTo方法。