在JAVA中解释这种泛型行为

时间:2018-07-02 11:29:27

标签: 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;
        }       
    }
    ...
}

我得到的错误是

  

“类型不匹配:无法从MyList.Node转换为   MyList.Node”。

不确定这是否与警告有关

  

“参数项正在隐藏类型项”

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

2 个答案:

答案 0 :(得分:5)

如果内部类var result = albums.GroupBy(album => album.AlbumId) // from every group, make one element with the sum of Spotify and sum of itunes: .Select(group => new { AlbumId = group.Key, Spotify = group.Select(groupElement => groupElement.Spotify).Sum(), ITunes = group.Select(groupElement => groupElement.Itunes).Sum(), }); 的泛型类型参数应与封闭类ListIterator的类型参数相同,则不应声明两次。

将内部类更改为:

MyList

这样,private class ListIterator implements Iterator<Item> first的类型将相同。

正如Michael所评论的,您必须将current实例的构造更改为:

ListIterator

答案 1 :(得分:3)

警告与有关。内部类中的泛型类型参数在外部类中隐藏泛型类型参数。因此,每个范围中的Item是不相同的,因此两个不同的Node<Item>实际上是不同的类型。

另请参阅:Troubleshooting "The type parameter T is hiding the type T" warning

Eran的答案显示了如何解决它,因此我不再重复。