0

このエラーが発生する理由を誰かが説明できますか?

二重リンクリストを使用して実装したスタッククラスは次のとおりです。

import java.util.Iterator;

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

private Node first;
private int N;

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

public Iterator<Item> iterator(){
    return new ReverseIterator<Item>();
}    

private class ReverseIterator<Item> implements Iterator<Item>{
    private Node x;

    private ReverseIterator(){
        if (first != null)
           x = first.prev;
    }

    public boolean hasNext(){
        return x != null;
    }

    public Item next(){
        Item i = x.item;
        x = x.prev;
        return i;
    }

    public void remove(){
    }
}

public void push(Item i){
    if (isEmpty()){
        first = new Node();
        first.item = i;
        first.next = first;
        first.prev = first;
    }
    else{
        Node x = new Node();
        x.item = i;
        x.next = first;
        x.prev = first.prev;
        first.prev.next = x;
        first.prev = x;
    }
    N++;
}

public Item pop(){
    assert !isEmpty() : "Stack is empty";

    Item i = first.prev.item;
    if (N == 1)
        first = null;
    else{
        first.prev.prev.next = first;
        first.prev = first.prev.prev;
    }

    N--;    
    return i;
}

public boolean isEmpty(){
    return N == 0;
}

public int size(){
    return N;
}

public static void main(String[] args){

}
}

コンパイラはItem i = x.item;、予期されたItem、見つかったItemにエラーがあると言います。解決策は、に置き換えることでしReverseIterator<Item>ReverseIterator。誰かが私が追加したエラーが発生した理由を説明できますか<Item>

ありがとう

4

3 に答える 3

4

型変数()に同じ名前を使用したからといっItemて、それが同じ汎用型を表すことを意味するわけではありません。

N<T>ジェネリッククラス内でネストされたクラスを宣言するC<T>と、TfromC<T>は実質的にの本体から隠されN<T>ます。xこれは、と呼ばれるクラスレベルのフィールドを宣言し、そのクラスでメソッドパラメータを宣言するのとまったく同じ原理です。これは。とも呼ばれxます。最も内側の宣言スコープは、外部から何かを隠します。

静的にネストされたクラスの場合、そのインスタンスにはを囲むインスタンスがないため、宣言にを追加する必要ReverseIteratorがあります。この場合、隠れることはありませんが、同じエラーが発生します。実際、型変数もに追加する必要があります。<Item>Stack<Item>Node

于 2012-06-09T00:26:15.280 に答える
1

あなたの問題はここにあります:

private class ReverseIterator<Item> implements Iterator<Item>{

ここでは、型のオブジェクトを処理する内部クラスを定義していますが、この型は、それを囲むクラスItemの型と同じ型ではありません。結果として、あなたがするとき、はタイプ(一種)であり、はタイプです。ItemStackItem i = x.item; x.itemStack.ItemiStack.ReverseIterator.Item

Item2つのオプションがあります。1つは、内部クラスが外部と同じ型を使用するようにするか、内部クラスを作成staticして独自の内部Item型を保持するかです(ただし、この場合は別の名前を使用することをお勧めします)インナータイプの場合、またはあなたは再び混乱するでしょう)。

于 2012-06-09T00:29:41.703 に答える
0

このようにしてみてください:

import java.util.Iterator;

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

    private Node first;
    private int N;

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

    @Override
    public Iterator<Item> iterator() {
        return new ReverseIterator();
    }

    private class ReverseIterator implements Iterator<Item> {
        private Node x;

        private ReverseIterator() {
            if (first != null) {
                x = first.prev;
            }
        }

        public boolean hasNext() {
            return x != null;
        }

        public Item next() {
            Item i = x.item;
            x = x.prev;
            return i;
        }

        public void remove() {
        }
    }

    public void push(final Item i) {
        if (isEmpty()) {
            first = new Node();
            first.item = i;
            first.next = first;
            first.prev = first;
        } else {
            Node x = new Node();
            x.item = i;
            x.next = first;
            x.prev = first.prev;
            first.prev.next = x;
            first.prev = x;
        }
        N++;
    }

    public Item pop() {
        assert !isEmpty() : "Stack is empty";

        Item i = first.prev.item;
        if (N == 1) {
            first = null;
        } else {
            first.prev.prev.next = first;
            first.prev = first.prev.prev;
        }

        N--;
        return i;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    public static void main(final String[] args) {

    }
}
于 2012-06-09T00:28:55.950 に答える