Java 实现类似于泛型类的

Java 实现类似于泛型类的,java,generics,interface,comparable,raw-types,Java,Generics,Interface,Comparable,Raw Types,我想定义一个实现泛型可比接口的类。在我的类中,我还定义了一个泛型类型元素T。为了实现接口,我将比较委托给T。下面是我的代码: public class Item<T extends Comparable<T>> implements Comparable<Item> { private int s; private T t; public T getT() { return t; } @Overri

我想定义一个实现泛型可比接口的类。在我的类中,我还定义了一个泛型类型元素T。为了实现接口,我将比较委托给T。下面是我的代码:

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

有人能告诉我为什么以及如何修复它吗?

您在类定义中使用的原始类型项是泛型的,但您忽略了类型参数,请将其更改为:

class Item<T extends Comparable<T>> implements Comparable<Item<T>>
没有任何类型参数的项是,因此:

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

new Item<String>().compareTo(new Item<Integer>())

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

class Item<E extends Comparable<E>> implements Comparable<E> {

 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<E> other)
    {
        return getE().compareTo(other.getE());
    }

 }

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

不是100%确定,但是否应该这样:compareToItem o是compareToItem o?为了使用最佳结果,您应该为这个问题选择一个答案。提问者希望通过比较项目的值来比较项目。如果T实现comparable,这是可能的,这里就是这种情况。是,请看一下我现在给出的另一个解决方案。你的回答根本没有什么意义。我们正在扩展可比性,而不是实施它。-实现接口和扩展类。不过,对于这两种情况,泛型中都使用extends。因为我们使用的是泛型类型T,所以不能重写compareTo方法-泛型类型不会阻止我们实现接口,例如ArrayList实现列表。T可以是任何东西[…]具体地说,它必须是可比较的东西-T已经是可比较的,在OP的代码和您的代码中,特别是它可以与自身相比较。这当然更好。
public class Item<T extends Comparable<T>>
implements Comparable<Item<T>> {

    ...

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

 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<E> other)
    {
        return getE().compareTo(other.getE());
    }

 }