2011-10-31 41 views
0

我需要在泛型一点帮助下面的代码:处理这个泛型错误

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

有什么错误? – birryree

+0

你看到什么症状会导致你相信有问题? –

+0

错误是我不能做任务 –

回答

1

您的问题是Comparable是一个接口,而不是一个类。你需要创建一个实现了Comparable的类的对象。

如果T工具Comparable,比你可以声明TMP为T和使用:

T tmp = a[j]; 
a[j] = a[j - 1]; 
a[j - 1] = tmp; 
+0

感谢您的回答。它的工作原理 –

0

而非可比tmp中,请使用t和tmp应该修复它,我认为。

+0

感谢您的回答。 –

2

a[j]T而不是Comparable

您只能将它放入类型为T的变量中。

+0

感谢您的回答。 –

0

需要注意的事项记在你的代码:

  • 你的T的定义是递归的。如果需要,可以制定一个界面。
  • 你的任务是错误的,编译器明确指出! :-)

    Comparable tmp = a [j];

这会起作用,因为这是真实和正确的。由于T延伸可比较,T is-a可比。

a[j - 1] = tmp; 

这是行不通的,因为您试图将超类实例分配给子类实例。可比较不保证有T行为。因此错误。

你可以尝试和参数化你的类,在这个函数所在。使用该参数来定义T.再次,您可能需要使用接口。除非我们更了解其他相关的设计目标,否则很难提供建议。明智的代码,错误是正确的和合理的。