2017-05-01 17 views
1

私はジェネリックを学んでおり、一般的なリンクリストを作成したいと考えています。Javaの汎用リンクリスト

コンパイル時にエラーが発生しています。

Type mismatch: cannot convert from LinkedList<E>.Node<E> to 
LinkedList<E>.Node<E> 
public class LinkedList<E> { 
    private Node<E> head = null; 

    private class Node<E> { 
     E value; 
     Node<E> next; 

     // Node constructor links the node as a new head 
     Node(E value) { 
      this.value = value; 
      this.next = head;//Getting error here 
      head = this;//Getting error here 
     } 
    } 

    public void add(E e) { 
     new Node<E>(e); 
    } 

    public void dump() { 
     for (Node<E> n = head; n != null; n = n.next) 
      System.out.print(n.value + " "); 
    } 

    public static void main(String[] args) { 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add("world"); 
     list.add("Hello"); 
     list.dump(); 
    } 
} 

私はこのエラーを取得していますなぜ私に教えてください?

+0

'Node'ジェネリックを設定する必要はありません。内部クラスであるため、周囲のクラスの一般的性質のために汎用クラスになります。 – Turing85

+0

内部クラスジェネリックタイプEを設定しているのは 'タイプパラメータEがタイプEを隠しているためです。 '(コンパイラ警告4行目) –

答えて

5

ここEprivate class Node<E> {ここEを非表示にします。public class LinkedList<E> {

Nodeクラスはジェネリックである必要はありません。 EジェネリックのLinkedListに依存する汎用フィールドvalueが含まれています。それで十分です。

public class LinkedList<E> { 
    private Node head = null; 

    private class Node { 
     E value; 
     Node next; 

     // Node constructor links the node as a new head 
     Node(E value) { 
      this.value = value; 
      this.next = head;//Getting error here 
      head = this;//Getting error here 
     } 
    } 

    public void add(E e) { 
     new Node(e); 
    } 

    public void dump() { 
     for (Node n = head; n != null; n = n.next) 
      System.out.print(n.value + " "); 
    } 

    public static void main(String[] args) { 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add("world"); 
     list.add("Hello"); 
     list.dump(); 
    } 
} 

EDIT

はあなたが書くとき、それは エラーメッセージ

を投げたときに言いたい何コンパイラを教えてください可能性:

this.next = head; 

あなたを〜する必要がありますこれらの2つの変数が同じ型に依存していないことを認識しています。

  • nextこのようにNode<E>クラスで宣言フィールドです:Node<E> next

  • headは、このようにLinkedList<E>クラスで宣言フィールドです:Node<E> head

しかしEタイプが宣言Node<E>クラスでは、コンパイラは同じであるとみなされませんクラスで宣言された型は、2つの異なる型宣言であるためです。だからここ

LinkedList<E>クラスからNode<E>クラスとNode<E> headフィールドからNode<E> nextフィールドが 同じ型を宣言していない(とではありませんんので

this.next = head; 

コンパイラはLinkedList<E>.Node<E>からLinkedList<E>.Node<E>に割り当てることはできません。転換可能かどうか)。

+0

コンパイラがエラーメッセージをスローするときに何を言いたいのですか? –

+0

もちろんです。説明を更新しました。 – davidxxx

+0

恐ろしい.... :) THanks –