Java Generics不兼容的类型linkedlist迭代器

Mat*_*att 5 java generics inner-classes

尝试为通用链表创建迭代器.当我尝试创建一个"当前"节点以便根据头部标记迭代列表时,我得到一个不兼容的类型错误.这是重要的线条

public class LinkedList<T> implements Iterable<T>
{
    private node<T> headsent;
    private node<T> tailsent; 
    public DistanceEventList()
    {
        headsent = new node<T>();
        tailsent = new node<T>();
        headsent.setnext(tailsent);
        tailsent.setprevious(headsent);
    }
    public node<T> getheadsent()
    {
        return headsent;
    }
    ...
    public MyIterator<T> iterator() {
        return new MyIterator<T>();
    }
    public class MyIterator<T> implements Iterator<T>
    {
        private node<T> current = getheadsent();
        public T next() {
            current = current.getnext();
            return current.getdata();
        }
    private class node<T> {
        private T data;
        private node<T> next;
        private node<T> previous;    
        ...
        public node<T> getnext()
        {
            return next;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并产生错误

LinkedList.java:65: error: incompatible types
private node<T> current = getheadsent();
required: LinkedList<T#1>.node<T#2)
found: LinkedList<T#1>.node<T#1)
Run Code Online (Sandbox Code Playgroud)

好像我已经介绍了两种不同类型的T,但我对于通用的确不太熟悉.希望上面的代码足以让某人识别出错误(它已经过时了).谢谢!

Rad*_*def 6

您有两种名称相同的类型.

内部类共享在其外部类中声明的类型变量.所以,当你有

public class MyIterator<T> implements Iterator<T>
//                     ^^^
Run Code Online (Sandbox Code Playgroud)

新类型声明会<T>影响外部声明.

private node<T> current = getheadsent();
//      ^^^^^^^           ^^^^^^^^^^^
//      inner T             outer T
Run Code Online (Sandbox Code Playgroud)

你可以删除声明:

public class MyIterator implements Iterator<T>
//                    ^^^
Run Code Online (Sandbox Code Playgroud)