2016-09-05 6 views
-3
public class Deque<Item> implements Iterable<Item> { 

    private int N; // size of the list 
    private Node first; 
    private Node last; 


    public Deque() { 


     private class Node { 
      private Item item; 
      private Node next; 
      private Node prev; 

     } 
    } 
} 

私は私のプライベートクラスのNodeに対して不正な修飾子を持っているというエラーが発生しており、finalまたはabstractのみが許可されています。しかし、Nodeクラスは独自に立つことができないので、静的が必要とは思われません。アイテムとノードがプライベートクラスでどのように宣言されているかに問題がありますか?このエラーを解決するにはどうすればよいですか?ネストされたクラスの不正な修飾子

+0

クラス内部のコンストラクタを定義していますか? –

+1

あなたは別のクラスのコンストラクタの内部でクラスを宣言しようとしているようです。おそらく、コンストラクタではなく、 'Deque'クラスの本体の内部にあることを意味します。 – khelwood

答えて

1

ブロックをクラスで定義できます(メソッドやコンストラクタなど)。Local classesと呼ばれます。

しかし、あなたはprivateprotectedまたはpublicなどのローカル変数を宣言することはできません同じように、あなたはまた、アクセス修飾子を持つローカルクラスを宣言することはできません - それはしても意味がありませんので。ローカルクラスは、定義メソッド内でのみ表示されます。

本当にローカルクラスを宣言する場合は、アクセス修飾子を削除してください。しかし、タイプNodeの最上位クラスのフィールドを宣言しているので、それをローカルクラスとして宣言することはできません。コンストラクタの外に移動するだけです。


ちょうど「私は静的が必要とされているとは思わない」についてのコメントに拾っ:私はstaticが必要ないではないと思います。 NodeインスタンスのDequeインスタンスを実際に参照する必要がある場合を除いて、ネストされたクラスにstaticを追加するのがデフォルトアクションである必要があります。

事がNodeクラスのそれぞれは、あなたがDeque.this経由Dequeインスタンスにアクセスすることができるようにするために、Dequeに隠された参照を持っているということです。この参照が必要ない場合は、使用していないメモリで使用するメモリを減らすことができます。入れ子にするクラスは、staticです。

4

あなたのロジックは基本的には健全です。主な欠点は、あなたがDequeue内に直接それを定義しなければならないのに対し、コンストラクタ内のクラスを定義しようとしているということです:メソッド内のクラスを定義

public class Deque<Item> implements Iterable<Item> { 

    private class Node { 
     private Item item; 
     private Node next; 
     private Node prev; 
    } 

    ... 
} 

は許されるが、それはあなたがここに必要なものではありません。背景については、Use of class definitions inside a method in Java

関連する問題