如何在链表中实现泛型 <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
我一直在尝试创建一个链接列表,该列表使用泛型来 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