实现与泛型类的可比性

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

public class Item<T extends Comparable<T>> implements Comparable<Item> {

    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<T#2> 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<T#1> declared in class Item
    T#2 extends Object declared in interface Comparable
1 error

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


答案 1

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

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

    new Item<String>().compareTo(new Item<Integer>())
    
  2. 该方法返回而不是 ,这会导致编译错误。o.getT()ComparableT

    在第 1 点下的示例中,在传递给 之后,我们会错误地将一个传递给 。编译错误阻止我们编写执行此操作的代码。Item<Integer>Item.compareToIntegerString.compareTo

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

public class Item<T extends Comparable<T>>
implements Comparable<Item<T>> {

    ...

    @Override
    public int compareTo(Item<T> o) {
        return getT().compareTo(o.getT());
    }
}

答案 2

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

class Item<T extends Comparable<T>> implements Comparable<Item<T>>

(注意最后一个<T>)

然后,还必须更改该方法:compareTo

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