2016-04-07 10 views
0

私は単純なLinkedListクラスを実装しており、ジェネリックを使用したいと考えています。クラス宣言は次のとおりです。Java一般的な形式パラメータ

public class LinkedList<E> extends AbstractList<E> implements List<E> { 

これは、教育の一例ですので、抽象親とのインタフェースも私自身です。問題は、ソートを追加して維持するために、私はクラス(E)が必要であることに気がつきました。これもまた比較可能です。私はそれを実際に違いを生む方法に限定できると思った。しかし、以下のコメントに基づいて、それは私の基本的な誤解かもしれません。ここで

コードです:

public void addSorted(<E extends Comparable<E>> value) { 
    if (front == null || value.compareTo(front.word) <= 0) { 
     // insert at front of list 
     front = new ListNode<E>(value, front); 
    } else { 
     // insert in middle of list 
     ListNode<E> current = front; 
     while (current.next != null && current.next.word.compareTo(value) < 0) { 
     current = current.next; 
     } 
     current.next = new ListNode<E>(value, current.next); 
    } 
    } 

私が特定のクラスがComparableを実装してE年代に限定されなければならない理由、その後addSortedを呼び出したいことはありません場合はように私には見えましたか?それとも、それを行うための全く別の方法がありますか?

ありがとうございます!

+2

:たとえば

static <E extends Comparable<E>> void sort(LinkedList<E> list) { // ... } 

正しい構文。'E'がクラスの型パラメータであれば' public > void addSorted(E value) 'または' public void addSorted(E value) 'のいずれかでなければなりません。もっと情報が必要です。 –

+1

問題を説明していない場合もありません。 – Savior

+4

あなたの質問に答えてください。コンパイルエラーがありますか?そこはありますか?代わりにランタイムエラーがありますか? – Baltasarq

答えて

1

あなたはLinkedListインスタンス上addaddSortedの両方を呼び出すことができれば何が起こるかを考えてみましょう:

    :あなたは "b"リスト ["c", "a"]に挿入されることを期待します。この場合、

    LinkedList<String> list = new LinkedList<>(); 
    list.add("c"); list.add("a"); 
    list.addSorted("b"); 
    

  • "c"の前に辞書編集的に存在するので、最初に挿入して["b", "c", "a"]とすることができます。
  • "a"の後に辞書編集的に挿入されているので、末尾に挿入すると["c", "a", "b"]となります。

しかし、どちらのリストも後で本当に「ソート」されません。

私には、このあいまいさを解決する唯一の明白な方法は、すべて追加をソートされた方法で強制的に行うことです。一般的に

class SortedLinkedList<E extends Comparable<E>> extends LinkedList<E> { 
    void add(E element) { 
    // The implementation of addSorted. 
    } 
} 

を、私は特定のジェネリック型でのみ使用できなければならないメソッドを扱うような方法でそれを行うことです。これは、あなたがLinkedList.addメソッドをオーバーライドするLinkedListのサブクラス、SortedLinkedListを作成する必要があることを意味しますクラスの定義外(またはクラスの定義内で、staticとして定義されている)のクラスのインスタンスを最初のパラメータとして受け入れるメソッドを使用します。つまり、クラスのインタフェースの一部ではないため、互換性のないジェネリック型のクラスには存在しません。

あなたがLinkedList Sをソートするsortメソッドを追加したい場合たとえば、これは明らかにComparable要素を持つもののためだけ賢明です:ありません

LinkedList<String> strList = new LinkedList<>(); 
// ... Add elements. 
sort(strList); // OK. 

LinkedList<Object> objList = new LinkedList<>(); 
// ... Add elements. 
sort(objList); // Compiler error - Object is not a valid bound. 
+0

優れた応答。いくつかのフォローアップ:LinkedList <>のすべての用途にComparableのサブクラスを必要としたいとしましょう。適切なクラス宣言は適切なクラス宣言でなければなりません:public class LinkedList > extends AbstractList extends List {?それは私が持っているもので、コンパイルすると正しく動作するようです。リストのインターフェイスにはComparableなどの記述はありませんが。第2に、私は、リストをまだソートしていないことを「addSorted」で検出し、それを最初にソートするかもしれないと思います。ブール値は、リストがすでにソートされているかどうかを追跡できます。 – pitosalas

+0

1)はい、そうです。 '>'は型変数をその制約で宣言します。 ''は単にそれを使用しているだけです(宣言するには 'String something'が必要ですが、それを使用するには' something'が必要です)。 –

+0

2)まあ、できると思いますが、ちょっと乱雑になります。 –

関連する問題