具有外类型参数的内部类

时间:2013-08-14 00:01:35

标签: java generics nested-class

我想创建一个在外层类型上参数化的内部类。

我首先要说的是,我意识到可能有更好的方法来实现我想要的结果,我愿意接受那些建议,但我会描述现状:

我有一个班级Node<T>,并尝试进行内部类声明,如下所示:

public class Node<T> {
    ...

    class NodeIterator<Node<T>> implements Iterator {
        ...
    }
}

这会在编译期间导致语法错误,我推断这是由于我使用外部类,虽然我不确定这一点。

谢谢!

2 个答案:

答案 0 :(得分:6)

简单地说:

public class Node<T> {
    ...

    class NodeIterator implements Iterator<Node<T>> {
        ...
    }
}

作为内部类,NodeIterator的实例具有对外部Node实例的隐式引用。因此,T类型仍在其正文范围内。

请注意,另一种方法是使NodeIterator static失去隐式外部引用:

static class NodeIterator<T> implements Iterator<Node<T>> {
    ...
}

此处,T必须重新声明,并且与外部类声明的T不同。

有关详细信息,请参阅Java Tutorials article on nested classes

答案 1 :(得分:1)

Iterator接口而不是内部类上指定泛型类型参数。

import java.util.Iterator;

public class Node<T> {


    class NodeIterator implements Iterator<Node<T>> {

        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public Node<T> next() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void remove() {
            // TODO Auto-generated method stub

        }    
    }
}

我怀疑语言不允许这样做,因为没有什么可以阻止你实例化一个与外部类类型不匹配的具体类型,例如:

//calling code
Node<Integer> node = new Node<Integer>();

//Node.java
public class Node<T>{

    NodeIterator<String> nodeIterator = new NodeIterator<String>();
}