2

車輪の再発明のように聞こえるかもしれませんが、マップを実装しようとしています (のようにMap<K,V>)。クラスには、以下のコードの短縮バージョンsortedKey()を返す関数が呼び出されます。ArrayList<K>コメントとしてインラインでデバッグする試みを含めました。

import java.util.ArrayList;
import java.util.Collections;

public class Map<K,V> {
    private ArrayList<Pair<K,V> > array; //Pair<K,V> is a class defined in another file.

    //returns an ArrayList(of proper type) of keys (ie, the desired function)
    public ArrayList<K> sortedKeys(){
        ArrayList<K> ret = keys(); //another method defined inside same class

        K s = ""; // error: no suitable method found for sort(ArrayList<K>)
        Collections.sort(new ArrayList<String>()); //Works just fine..
        Collections.sort(ret); //Same error here..
        return ret;
    }
}

そのエラーが表示される理由について何か考えはありますか? クラスの作成に使用される型変数に応じて、ジェネリックな戻り値の型を持たせないことはできますか? それとも、目的の効果を得るために何か他のことをしなければなりませんか?

この質問が既に尋ねられている場合は、感謝と謝罪

カジェタン

4

4 に答える 4

3

の署名を見てくださいCollections.sort:

public static <T extends Comparable<? super T>> void sort(List<T> list)

紛らわしいかもしれませんが、エラーは正しいです。任意の型のリストで sort を呼び出すことはできません。要素タイプは Comparable を実装する必要があります。

次のように、ジェネリック パラメーターを比較できるように制限する場合:

public class Map<K extends Comparable<K>,V> {
    ...

その後、への呼び出しはCollections.sort(ret)期待どおりに成功します。

ジェネリック パラメーターに対するこの制限がなければ、誰かがMapキーの型を比較不可能なものとして作成する可能性がExceptionありますCollections.sort。:)

于 2012-06-27T11:45:26.340 に答える
2

コンパイラは、それKが順序付きの型ではない可能性があることを示しています。クラスを次のように宣言する必要があります

public class Map<K extends Comparable<K>, V> {

K値を他の値と比較できることを保証しKます。

于 2012-06-27T11:43:28.327 に答える
0

まあ...あなたはコンパレータを提供するか、K(どちらであっても)クラスに匹敵する実装を提供する必要があります。

同等のものを実装する場合は、このようにクラス パラメータを宣言して、同等のオブジェクトのみを含むように制限します。

public class Map<K extends Comparable<K>, V> 
于 2012-06-27T11:42:43.613 に答える
0

Collection.sort()の Javadoc から、型は

public static <T extends Comparable<? super T>> void sort(List<T> list)

つまり、orKとして宣言する必要があります。Comparable<K>Comparable<? super K>

于 2012-06-27T11:43:01.547 に答える