java - 两个私有(private)子类中的相同类型变量未被识别为相同

标签 java generics subclass

在对数据结构的实现进行一些研究后,我在尝试使用与父类相同的泛型类创建两个子类时发现了一个问题。

我以前没有发现这个问题,因为我通常避免做私有(private)子类,尽管这次我想做一个快速测试并发现了这个。

我可以在没有 Node<T> 的情况下让它工作作为current类型,但是Node ,然后转换为 T 。但我想知道为什么编译器不理解它是相同的 T就像在节点中一样。它认为T在节点和 TLinkedStackIterator是两个不同的T s,尽管 T在节点中被识别为 TLinkedStack .

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 引用 LinkedStackT,而 current 引用 LinkedStackIteratorT

要允许两个类使用相同的 T 类型,请不要在内部类中声明第二次 T,而是重用在外部类中声明的一个类:

private class LinkedStackIterator implements Iterator<T>{

关于java - 两个私有(private)子类中的相同类型变量未被识别为相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613927/

相关文章:

java - 在 Java 中使用 ORM 处理与接口(interface)的关联

java - "Varaible"无法解析为变量

Java 泛型 : Bound mismatch. 寻找有效的替代品

c++ - 定义子类的对象

swift - 如何编写定义一个也接受指定类型子类的变量的通用协议(protocol)?

java - 为什么 mongo 弃用了 MongoIterable.forEach(Block)?

java - 是否可以从 java.sql.Connection 获取 url 或服务器信息

java - 调整数组大小

ios - 如何将带有类名称的字符串转换为类类型本身?

python - 如何重写python3 __sub__函数,以便不更改数据类型