6

SkipList を作成しようとしていますが、ジェネリック データ型を使用するメソッドがあります。

public void add(E key, Integer value)
{
    Node<E> p; 
    p = find(key);
}

ここにあなたを連れて行きます:

public Node<E> find(E key)
{
    //Start at head
    Node<E> p = head;

    while (true)
    {
        while ( (p.getRight().getKey() != Node.posInf) && (p.getRight().getKey().compareTo(key) <= 0 )) 
        {
            p.setRight(p.getRight());
        }

        //More stuff down here
    }
}

問題はcompareTo()方法にあります。メソッドはcompareTo()type に対して未定義ですE。Eclipse では、次のような 2 つの型キャストを追加する必要があります。

((String) p.getRight().getKey().compareTo((String) key) <= 0 )

なぜそれが欲しいのStringですか?データ型は何でもかまいません。代わりにtypecast を実行しようとしEましたが、Eclipse はそれを に戻したいと考えていますString。どんな助けでも大歓迎です。

4

2 に答える 2

8

がどのように定義されているかは示されていませんが、エラー メッセージは、 の宣言に のE上限を設定しなかったことを示しています。Comparable<E>E

クラスで次のようなものを使用してそれを実現できます。

public class SkipList<E extends Comparable<E>>

これにより、 type の変数を呼び出すことができcompareToます。keyE

Eclipse が へのキャストを提案している理由については、Eclipse はString、コンパイルするために何が最適な変更であるかを推測しているようです。Stringだったから察したのかもしれないComparable<String>。この場合、E必ずしも . ではないため、間違っていStringます。上で述べたように、ここでの解決策は異なりEますComparable<E>

于 2015-07-07T17:54:46.430 に答える
5

メソッドcompareToは interface で定義されますjava.lang.ComparableEコードには、型パラメーターがであることをコンパイラーに伝えるものは何もありませんComparable。これは、ジェネリック型宣言で行うことができます。

class Node<E extends Comparable<E>> {
   ...
}

デフォルトでは、 を宣言しない場合、クラスextends Comparableで定義されたメソッドにのみアクセスできます。java.lang.Object

于 2015-07-07T17:54:35.140 に答える