2017-12-06 10 views
3

私は外部クラスDoublyLinkedList<T>と2つの内部クラスDoublyLinkedNode<T>DoublyLinkedListIterator<T>を持っています。今同じタイプへのキャストを追加

public class DoublyLinkedList<T> extends Collection<T> { 

    private DoublyLinkedNode<T> head; 
    private DoublyLinkedNode<T> tail; 

    public class DoublyLinkedNode<T> { 

     private DoublyLinkedNode<T> prev; 
     private DoublyLinkedNode<T> next; 
     T element; 

    } 

    public class DoublyLinkedListIterator<T> implements ListIterator<T> { 

     private DoublyLinkedNode<T> current = head; 

    } 

} 

私は私はあなたが持っているので、それは容易になるだろうと思った、stackoverflowの中に複数のページやイテレータはDoublyLinkedList<T>のように対応する反復可能なクラスで実装する必要があることを他のソースに読み/聞いたので、次のように彼らが配置されています外部クラスフィールドへのアクセス。今私はDoublyLinkedListIterator<T>のインスタンスを初期化したいのですが、Eclipseは、この時点でこう述べています。DoublyLinkedListにDoublyLinkedList.DoublyLinkedNode < T>から変換することはできません。

型の不一致:DoublyLinkedListIterator<T>内部

private DoublyLinkedNode<T> current = head; 

。 DoublyLinkedNode < T>

そして、これを解決する唯一の方法は、再び同じタイプでそれをキャストすることによってである:

private DoublyLinkedNode<T> current = (DoublyLinkedNode<T>) head; 

なぜそうですか?

+2

DoublyLinkedListIterator 'ので、 '' ListIterator'を実装している場合、 'DoublyLinkedList'に' Collection'の上に 'List'を実装させることをお勧めします。 – Izruo

答えて

11

内部クラスDoublyLinkedNodeDoublyLinkdListIteratorを宣言しました。 内部クラスは、包含クラスのすべてのジェネリック型パラメータのスコープを持っています。そのため、Tは既に利用可能です。それらを再度宣言すると、囲みクラスにTが隠れてしまいます。それらは異なるTです。

(インターフェースである、Collectionを実装する必要がありますし、あなたのクラス)の外Tを隠しているTの再宣言を削除して、あなたの内部クラスは、外部Tを使用してみましょう:

public class DoublyLinkedList<T> implements Collection<T> { 

    private DoublyLinkedNode head; 
    private DoublyLinkedNode tail; 

    public class DoublyLinkedNode { 
     private DoublyLinkedNode prev; 
     private DoublyLinkedNode next; 
     T element; 
    } 

    public class DoublyLinkedListIterator implements ListIterator<T> { 
     private DoublyLinkedNode current = head; 
    } 
} 
+0

このクラスの外で 'DoublyLinkedListIterator'を使って対処する方法について提案がありますか?パラメータ型がなくなったので、 'DoublyLinkedListIterator iterator = someDoublyLinkedList.iterator(); 'のような単純な代入は、イテレータのnext()メソッドを呼び出すときにのみ' Object'を返します。代入内の型にパラメータを追加することはできません。クラス宣言に型パラメータを追加すると、変更が元の状態に戻ります。 – CRoemheld

+1

イテレータのインスタンスを返すときは、そのメソッドにインタフェース「Iterator 」または「ListIterator 」を返します。呼び出し側は実装を知る必要はありません。 'DoublyLinkedListIterator'を' private'にすることさえできます。 – rgettman

関連する問題