5

我是一名二年级计算机科学专业的学生,​​目前正在学习 Java,我们最近开始使用泛型。我有一个任务,我得到了一个使用泛型的排序算法列表,并负责使用它们对整数列表(不是原始整数)进行排序。由于排序类使用扩展 Comparable 的泛型,我认为简单地将 Integer 数组交给它们不会有问题,但构建输出不断出现不兼容的类型。

相关代码如下;

主程序的一部分

final int NUMITEMS = 100000;
Integer[] list = new Integer[NUMITEMS];
int dataSize = 0;

//method reads contents of a file into array and returns number of objects
System.out.println((dataSize = readDataFile(list)));

SelectionSort SS = new SelectionSort(list, dataSize);//problem is here

以及按原样提供和预期使用的 SelectionSort 算法

class SelectionSort<T extends Comparable<? super T>> implements SortAlgorithm<T>  {

public void  sort ( T [ ] theArray,   int size ) {

  for (int last = size-1; last > 0 ; last--)
  {
     int largest = 0;
     for (int scan = 1; scan <= last; scan++)
        if (theArray[scan].compareTo(theArray[largest])>0)
           largest = scan;

     /** Swap the values */
     T temp = theArray[largest];
     theArray[largest] = theArray[last];
     theArray[last] = temp;
  }
} // method selectionSort

我遇到的问题是声明 SelectionSort,它返回一个错误,即构造函数不能应用于给定类型。从我在这里和其他地方的搜索中读到的内容,在使用整数时通常会遇到这种问题,但我不明白为什么它不适用于整数。对这个问题的任何见解将不胜感激,因为我仍在接受泛型的概念。提前谢谢了!

4

5 回答 5

3

这应该可以解决问题:

SelectionSort<Integer> ss = new SelectionSort<Integer>();
ss.sort(list, dataSize);

当您想将参数传递给方法时,您试图将参数传递给不存在的构造函数sort

在这里,我使用默认(无参数)构造函数来实例化一个 new SelectionSort<Integer>,将其分配给一个 variable ss,然后sort使用参数调用该实例。

另请注意,如果您只需要调用实例sort,则可以跳过分配:

new SelectionSort<Integer>().sort(list, dataSize);
于 2012-11-05T22:39:28.490 回答
3

你的SelectionSort课是通用的。您应该在声明和实例化其中之一时指定类型参数:

SelectionSort<Integer> SS = new SelectionSort<Integer>(list, dataSize);

在 Java 7 中,您可以依靠类型推断来缩短这一点:

SelectionSort<Integer> SS = new SelectionSort<>(list, dataSize);
于 2012-11-05T22:29:11.053 回答
3
SelectionSort SS = new SelectionSort(list, dataSize);//problem is here

应该

SelectionSort<Integer> SS = new SelectionSort<Integer>(list, dataSize);//no problem now

您的 SelectionSort 具有参数化类型(实现可比较的某种类型)。java.lang.Integer实现Comparable

于 2012-11-05T22:30:05.317 回答
2
SelectionSort SS = new SelectionSort(list, dataSize);

需要改为:

SelectionSort<Integer> SS = new SelectionSort<Integer>(list, dataSize);

创建对象时必须声明参数化类型

于 2012-11-05T22:29:08.073 回答
1

除了已经涵盖的泛型问题之外,我认为代码混淆了构造函数和排序方法。将失败的行更改为:

SelectionSort<Integer> SS = new SelectionSort<Integer>();
SS.sort(list, dataSize);

该代码没有显示 SelectionSort 构造函数,只显示了一个排序方法,该方法需要传递给构造函数的参数。该错误消息与仅具有编译器默认提供的无参数构造函数的 SelectionSort 一致。

于 2012-11-05T22:43:38.293 回答