fra*_*liu 15 java generics interface comparable raw-types
我想定义一个实现通用Comparable接口的类.在我的课堂上,我还定义了一个泛型类型元素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());
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误信息:
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
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么以及如何解决它?
Rad*_*def 18
Item(没有任何类型参数)是原始类型,因此:
我们可以通过任何一种Item方式Item.compareTo.例如,这将编译:
new Item<String>().compareTo(new Item<Integer>())
Run Code Online (Sandbox Code Playgroud)该方法o.getT()返回Comparable而不是T,这会导致编译错误.
在第一点下的示例,通过后Item<Integer>到Item.compareTo,我们便错误地传递一个Integer到String.compareTo.编译错误阻止我们编写执行该操作的代码.
我想你只需要删除原始类型:
public class Item<T extends Comparable<T>>
implements Comparable<Item<T>> {
...
@Override
public int compareTo(Item<T> o) {
return getT().compareTo(o.getT());
}
}
Run Code Online (Sandbox Code Playgroud)
您在类定义中使用原始类型(Item<T>是通用的,但是您省略了类型参数<T>),将其更改为:
class Item<T extends Comparable<T>> implements Comparable<Item<T>>
Run Code Online (Sandbox Code Playgroud)
(注意最后一个<T>)
compareTo然后还必须更改该方法:
public int compareTo(Item<T> o) { // again, use generics
return getT().compareTo(o.getT());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51409 次 |
| 最近记录: |