我需要在以下代码中对泛型有一些帮助:
public <T extends Comparable<T>> int insertionSort(T[] a) {
// throw new RuntimeException("not implemented");
final int L = a.length;
int compares = 0;
for(int i = 1; i < L; i++){
for(int j = i; j > 0 && a[j].compareTo(a[j - 1]) < 0; j--){
Comparable tmp = a[j]; // PROBLEM HERE
a[j] = a[j - 1];
a[j - 1] = tmp; // PROBLEM HERE
compares++;
}
}
return compares;
}
//问题在这里 代码中的这两行是错误的,需要帮助修复它们。
感谢
修改
错误是我无法进行作业
答案 0 :(得分:2)
a[j]
是T
,而不是Comparable
。
您只能将其放入T
类型的变量中。
答案 1 :(得分:1)
你的问题是Comparable
是一个接口,而不是一个类。您需要创建一个实现Comparable
的类的Object。
如果T
实现了Comparable
,那么您可以将tmp声明为T
并使用它:
T tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
答案 2 :(得分:0)
而不是Comparable tmp,使用T tmp,我认为应该修复它。
答案 3 :(得分:0)
您的代码中需要注意的事项:
编译器明确指出你的作业是错误的! : - )
可比较的tmp = a [j];
这将有效,因为这是真实和正确的。由于T扩展了Comparable,因此T 是-a 可比较。
a[j - 1] = tmp;
这不起作用,因为您正在尝试将超类实例分配给子类实例。可比较不保证具有T行为。因此错误。
您可以尝试参数化此功能所在的类。使用该参数定义T.再次,您可能需要使用接口。除非我们更了解其他相关的设计目标,否则很难提出建议。代码方面,错误是正确和合理的。