Java 实现类似于泛型类的
我想定义一个实现泛型可比接口的类。在我的类中,我还定义了一个泛型类型元素T。为了实现接口,我将比较委托给T。下面是我的代码: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
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());
}
}