在JAVA中解释这个泛型行为

Par*_*val 3 java generics extends

public class MyList<Item> implements Iterable<Item> {
    Node<Item> first;
    int n = 0;

    private static class Node<Item>
    {
        private Item item;
        private Node<Item> next;
    }
    public Iterator<Item> iterator()  {
        return new ListIterator<Item>();
    }

    private class ListIterator<Item> implements Iterator<Item>  // parameter Item is hiding the type Item
    {
        private Node<Item> current = first;  // This does not compile

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

        public Item next() {
            Item item = current.item;
            current = current.next;
            return current.item;
        }       
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

"类型不匹配:无法从MyList.Node转换为MyList.Node".

不确定这是否与警告有关

"参数Item隐藏了类型项"

如果我收到警告private class ListIterator<Item> implements Iterator<Item>,为什么我没有收到警告public class MyList<Item> implements Iterable<Item>

Era*_*ran 5

如果内部类的泛型类型参数ListIterator应与封闭类的类型参数相同MyList,则不应将其声明两次.

将内部类更改为:

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

这样,类型firstcurrent将是相同的.

正如Michael评论的那样,您必须将ListIterator实例的构造更改为:

public Iterator<Item> iterator()  {
    return new ListIterator();
}
Run Code Online (Sandbox Code Playgroud)