在Java中,为什么在内部类上使用泛型不起作用?

Han*_*Sun 1 java generics types

我的编译器是JDK 6.0_65,以下是我的代码(Deque.java):

import java.util.Iterator;
public class Deque<Item> implements Iterable<Item> {
    private Node first;
    private Node last;

    private class Node {
        Item value;
        Node next;        
    }

    public Deque(){}                  // construct an empty deque

    public Iterator<Item> iterator() {
        // return an iterator over items in order from front to end
        return new DequeIterator<Item>();
    } 

    private class DequeIterator<Item> implements Iterator<Item> {
        private Node current = first;
        public boolean hasNext() {
            return current.next != null;
        }
        public Item next() {
            Item item = current.value;
            current = current.next;
            return item;
        }
        public void remove() {}

    }
    public static void main(String[] args)   {         
      // unit testing
        Deque<Integer> dq = new Deque<Integer>();

    }

}
Run Code Online (Sandbox Code Playgroud)

在外部范围内:

public class Deque<Item> implements Iterable<Item> {
Run Code Online (Sandbox Code Playgroud)

用来.

在内在范围内:

private class DequeIterator<Item> implements Iterator<Item> {
Run Code Online (Sandbox Code Playgroud)

用来.

在范围内DequeIterator.笔者预计本地范围(内部类的范围)Item将影子类作用域ItemDeque<Item>.

但是,在编译阶段,javac会抛出这样的错误:

Deque.java:2: error: incompatible types
            Item item = current.value;
                               ^
  required: Item#2
  found:    Item#1
  where Item#1,Item#2 are type-variables:
    Item#1 extends Object declared in class Deque
    Item#2 extends Object declared in class Deque.DequeIterator
Run Code Online (Sandbox Code Playgroud)

它说,Item#2Item#1是不兼容的类型,它看起来相当混乱到我,因为我已经通过了类型参数ItemDequeIterator使用new DequeIterator<Item>().

有没有人对此有任何想法?

Paw*_*tyl 7

我期望局部范围(内部类范围)Item将遮蔽类范围ItemDeque<Item>

这基本上就是发生的事情 - 内部范围Item遮蔽了外部范围.你将外部传递Item给构造函数并不重要.内部类有编译问题,因为你试图将类型为outer的值赋给inner-类型Item的变量Item.

要解决这个问题,只需使嵌套类非泛型:

private class DequeIterator implements Iterator<Item>
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您将使用外部 - Item而无需声明Item您不需要的另一个类型参数.