如何在链接列表中实现泛型<e>?

时间:2015-05-08 04:55:12

标签: java generics linked-list

我一直在尝试创建一个链接列表,该列表使用泛型来返回用户选择的数据类型。问题是我的方法public E get(int sub) 我没有将return cursor.contents识别为E generic类型。

public E get(int sub)
{
    Node cursor = head; //start at the beginning of linked list. 

    for (int c = 1; c <= sub; c++)
    {
        cursor = cursor.next; //move forward by one. 
    }

    return cursor.contents;//return the element that the cursor landed on. 
}


 public class Node <E>
{
        public E contents; 
    @SuppressWarnings("rawtypes")
    public Node next = null; //points to the next node
    //a method has no return type and has the same name as the class
    public Node(E element)
    {
        this.contents = element; 
    }
}

如上所示,contents参数在Node中声明为type E,但get方法不会将cursor.contents识别为正确的返回类型。

系统建议我将返回类型更改为Object,这不是一个选项。或者我将内容更改为已经完成的类型E,但它仍然给我一个编译错误。

4 个答案:

答案 0 :(得分:1)

您没有在Node cursor变量的声明中设置泛型类型。将其更改为Node<E> cursor时会发生什么。

另外,你没有提供链表类本身的上下文 - 那就是应该声明泛型<E>的地方。

答案 1 :(得分:1)

那是因为您需要将其更改为:

public E get(int sub)
{
    Node<E> cursor = head; //you forgot the generics here

    for (int c = 1; c <= sub; c++)
    {
        cursor = cursor.next; 
    }

    return cursor.contents;
}


 public class Node <E>
{
    public E contents; 
    public Node<E> next = null; //you also even suppressed the raw type here

    public Node(E element)
    {
        this.contents = element; 
    }
}

答案 2 :(得分:1)

在你的方法中

public E get(int sub)

您将游标初始化为节点而不是Node<E>

Node cursor = head; //start at the beginning of linked list. 

这将导致元素类型为Object,这是您在编写时获得的

return cursor.contents;

要解决:

使用Node<E>或明确地将回复转换为E

答案 3 :(得分:0)

类的这些部分是否带有类型参数,例如MyLinkedList<E>?问题可能是您向Node类添加了<E>类型参数,这可能引用了不同的类E,该类不一定是外部类引用的E 。尝试将Node <E>更改为Node。看看它是否有效。