5

私は現在Javaで働いているコンピュータサイエンスの2年生で、最近ジェネリックを始めました。ジェネリックスを使用するソートアルゴリズムのリストが与えられ、それらを使用して整数のリスト(プリミティブintではない)をソートするという課題があります。ソートクラスはComparableを拡張するジェネリックスを使用するため、整数配列を渡すだけで問題はないと思いましたが、ビルド出力は互換性のない型を出し続けます。

関連するコードは以下のとおりです。

メインプログラムの一部

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の宣言にあります。これは、コンストラクターを指定された型に適用できないというエラーを返します。ここや他の場所での検索で読んだことから、この種の問題は通常、intを使用するときに発生しますが、整数で機能しない理由がわかりません。私はまだジェネリックスの概念に同意しているので、問題に関する洞察をいただければ幸いです。よろしくお願いします!

4

5 に答える 5

3

あなたのSelectionSortクラスはジェネリックです。それらの1つを宣言してインスタンス化するときに、typeパラメーターを指定する必要があります。

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にはパラメーター化されたタイプ(比較可能なものを実装するsometype)があります。java.lang.Integerを実装しComparableます。

于 2012-11-05T22:30:05.317 に答える
3

これで問題が解決するはずです。

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

sort代わりに引数をメソッドに渡したいときに、存在しないコンストラクターに引数を渡そうとしていました。

ここでは、デフォルト(引数なし)のコンストラクターを使用して新しいインスタンスを作成し、それSelectionSort<Integer>を変数に割り当ててから、引数を使用してそのインスタンスをss呼び出しています。sort

sortまた、インスタンスを呼び出すだけでよい場合は、割り当てをスキップできることにも注意してください。

new SelectionSort<Integer>().sort(list, dataSize);
于 2012-11-05T22:39:28.490 に答える
2
SelectionSort SS = new SelectionSort(list, dataSize);

次のように変更する必要があります:

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

オブジェクトを作成するときに、パラメータ化されたタイプを宣言する必要があります

于 2012-11-05T22:29:08.073 に答える
1

すでに説明したジェネリックの問題に加えて、コードはコンストラクターとsortメソッドを混同していると思います。失敗した行を次のように変更します。

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

このコードは、SelectionSortコンストラクターを示しておらず、コンストラクターに渡されていたパラメーターを予期するソートメソッドのみを示しています。エラーメッセージは、コンパイラによってデフォルトで提供されるパラメータなしのコンストラクタのみを持つSelectionSortと一致しています。

于 2012-11-05T22:43:38.293 に答える