如何在链表中实现泛型 <E>?

How do I implement generics <E> in a linked List?

我一直在尝试创建一个链接列表,该列表使用泛型来 return 用户选择的数据类型。问题是我的方法 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 识别为正确的 return 类型。

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

class 的这些部分是否带有类型化参数,例如 MyLinkedList<E>?问题可能是你在节点 class 中也添加了一个 <E> 类型参数,它可能引用不同的 class E 不一定相同 E 被外部 class 引用。尝试将 Node <E> 更改为 Node。看看它是否有效。

您没有在 Node cursor 变量的声明中设置泛型类型。当您将其更改为 Node<E> cursor.

时会发生什么

此外,您没有提供链表 class 本身的上下文 - 那是应该声明通用 <E> 的地方。

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

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; 
    }
}

用你的方法

public E get(int sub)

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

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

这将导致元素类型为 Object,这就是您在编写时得到的结果

return cursor.contents;

求解:

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