Java中的泛型在定义方法时抛出错误
我正在学习Java中的泛型。为此,我尝试了这样一个简单的LinkedListJava中的泛型在定义方法时抛出错误,java,generics,Java,Generics,我正在学习Java中的泛型。为此,我尝试了这样一个简单的LinkedList class Node { private int age; private String name; private Node next; public Node(int age, String name) { this.age = age; this.name = name; this.next = null; } public int getAge() {
class Node {
private int age;
private String name;
private Node next;
public Node(int age, String name) {
this.age = age;
this.name = name;
this.next = null;
}
public int getAge() {
return this.age;
}
public String getName() {
return this.name;
}
public Node getNext() {
return this.next;
}
public void setNext(Node next) {
this.next = next;
}
}
class LinkedList<T> {
private T head;
private T current;
public LinkedList() {
head = null;
current = null;
}
public void append(T x) {
if (head == null) {
head = x;
current = x;
}
else {
current.setNext(x);
current = x;
}
}
public T getAt(int index) {
T ptr = head;
for(int i = 0; i < index; i++) {
ptr = ptr.getNext();
}
return ptr;
}
}
class Main {
public static void main(String[] args) {
LinkedList<Node> list = new LinkedList<Node>();
list.append(new Node(39, "John"));
list.append(new Node(43, "Josh"));
Node x = list.getAt(1);
System.out.println(String.format("%d, %s", x.getAge(), x.getName()));
}
}
如果
current
的类型为T
,则不能在current
上调用节点
类的方法(例如setNext()
),因为在实例化LinkedList
时,T
可以被任何类替换
您的节点
类不应是链接列表
的泛型类型参数。链接列表应始终由节点组成。每个节点中存储的数据类型应为通用类型
class Node<T> {
private T data;
private Node next;
public Node(T data) {
this.data = data;
this.next = null;
}
}
如果current
的类型为T
,则不能在current
上调用节点
类的方法(例如setNext()
),因为在实例化LinkedList
时,T
可以被任何类替换
您的节点
类不应是链接列表
的泛型类型参数。链接列表应始终由节点组成。每个节点中存储的数据类型应为通用类型
class Node<T> {
private T data;
private Node next;
public Node(T data) {
this.data = data;
this.next = null;
}
}
您必须创建节点
和链接列表
您必须创建节点
和链接列表
编译器无法理解T类型。您已经使用了t.setNext()
,但是除非实际使用,否则它不会出现在t定义中。我在这里可能听起来有点困惑,但试试这个:
创建一个具有setNext和getNext方法的接口Contract
。
实现节点在接口之上的扩展<代码>节点执行合同
。
在链表中将泛型更改为T extends Contract
编译器无法理解T类型。您已经使用了t.setNext()
,但是除非实际使用,否则它不会出现在t定义中。我在这里可能听起来有点困惑,但试试这个:
创建一个具有setNext和getNext方法的接口Contract
。
实现节点在接口之上的扩展<代码>节点执行合同
。
在链表中,将泛型更改为
T extends Contract
对于任何给定的泛型T
,都没有hasNext
,因此代码不会编译
您必须确保LinkedList只保存节点类或其子类型
class LinkedList<T extends Node>
类链接列表
但是请注意:T与存储在节点中的泛型不同,因此这似乎更好
class LinkedList<T> {
Node<T> head;
类链接列表{
节点头;
对于任何给定的泛型T
,都没有hasNext
,因此代码不会编译
您必须确保LinkedList只保存节点类或其子类型
class LinkedList<T extends Node>
类链接列表
但是请注意:T与存储在节点中的泛型不同,因此这似乎更好
class LinkedList<T> {
Node<T> head;
类链接列表{
节点头;
private T current;
是一种泛型类型,您正在对其调用setNext
和getNext
。为什么T
知道它总是有这些方法?这就是它不工作的原因
因此,您需要确保泛型类型T知道它有setNext
和getNext
方法
因此,解决方案是:
T在类定义中扩展了NodeAbstract
,其中NodeAbstract是声明这些方法签名的接口。现在,这确保了T得到的任何东西都将始终具有这两个方法。private T current;
是泛型类型,您正在对其调用setNext
和getNext
我T
知道它总是有这些方法吗?这就是它不起作用的原因
因此,您需要确保泛型类型T知道它有setNext
和getNext
方法
因此,解决方案是:
T在类定义中扩展了NodeAbstract
,其中NodeAbstract是声明这些方法签名的接口。现在这确保了T得到的任何东西都会有这两个方法。好的,这当然是首选方法,但为什么我在代码中会出错?我看不出有什么错误。@metallicyo您试图在类型为泛型类型参数T
的实例上调用Node
类的方法。这是错误的。好的,这当然是首选方法,但为什么我在该代码中仍然会出错?我看不出有什么错误。@metallicprest您试图在类型为泛型类型参数T
的实例上调用Node
类的方法se type是泛型类型参数T
。这是错误的。