[英]Explain this Generics Behavior in JAVA
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”。
不确定这是否与警告有关
“参数Item隐藏了类型项”
如果我收到private class ListIterator<Item> implements Iterator<Item>
的警告,为什么我没有得到public class MyList<Item> implements Iterable<Item>
的警告public class MyList<Item> implements Iterable<Item>
?
如果内部类ListIterator
的泛型类型参数应与封闭类MyList
的类型参数相同,则不应将其声明两次。
将内部类更改为:
private class ListIterator implements Iterator<Item>
这样, first
和current
的类型将是相同的。
正如Michael评论的那样,您必须将ListIterator
实例的构造更改为:
public Iterator<Item> iterator() {
return new ListIterator();
}
警告非常相关。 内部类中的泛型类型参数隐藏外部类中的泛型类型参数。 因此每个范围中的Item
不相同,因此两个不同的Node<Item>
实际上是不同的类型。
另请参阅: 故障排除“类型参数T隐藏类型T”警告
Eran的回答显示了如何解决它,所以我不会重复它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.