在对数据结构的实现进行一些研究后,我在尝试使用与父类相同的泛型类创建两个子类时发现了一个问题。
我以前没有发现这个问题,因为我通常避免做私有(private)子类,尽管这次我想做一个快速测试并发现了这个。
我可以在没有 Node<T>
的情况下让它工作作为current
类型,但是Node
,然后转换为 T
。但我想知道为什么编译器不理解它是相同的 T
就像在节点中一样。它认为T
在节点和 T
在LinkedStackIterator
是两个不同的T
s,尽管 T
在节点中被识别为 T
在LinkedStack
.
public class LinkedStack<T> implements Iterable<T>{
private Node<T> first = null;
private class Node<T>{
private T item;
private Node next;
}
private class LinkedStackIterator<T> implements Iterator<T>{
private Node<T> current = first; //Error here
public boolean hasNext() { return current.next == null; }
public void remove() { throw new UnsupportedOperationException(); }
public T next()
{
T item = current.item;
current = current.next;
return item;
}
}
}
Error: incompatible types: LinkedStack<T#1>.Node<T#1> can not be converted to LinkedStack<T#1>.LinkedStackIterator<T#2> where T#1 and T#2 are type variables.
T#1 extends Object in LinkedStack
T#2 extends Object in LinkedStack.LinkedStackIterator.
感谢您的帮助。
最佳答案
在这里声明两种不同的 T
类型:
public class LinkedStack<T> implements Iterable<T>{
...
private class LinkedStackIterator<T> implements Iterator<T>{
...
}
所以这个语句无法编译:
private Node<T> current = first;
因为first
变量引用了与current
变量不同的类型。
first
引用 LinkedStack
的 T
,而 current
引用 LinkedStackIterator
的 T
要允许两个类使用相同的 T
类型,请不要在内部类中声明第二次 T
,而是重用在外部类中声明的一个类:
private class LinkedStackIterator implements Iterator<T>{
关于java - 两个私有(private)子类中的相同类型变量未被识别为相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613927/