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>
的警告?
答案 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的答案显示了如何解决它,因此我不再重复。