我正在尝试为java中的链表创建一个泛型类,我遇到了一些我无法调试的错误。
代码:
class node<T>
{
T value;
node<T> next;
}
class LinkedList<T>
{
static node<T> head,last;
static int no;
node<T> current=new node<T>();
public <T> void add(T x)
{
this.current.value=x;
this.current.next=null;
last.next=this.current;
last=this.current;
if(no==0)
head=this.current;
no++;
}
public <T> T remove()
{
node<T> y=head;
while(y.next.next!=null)
{
y=y.next;
}
T z =y.next.value;
y.next=null;
last=y;
return z;
}
}
我对泛型没什么经验。这是我得到的错误:
linkedlist.java:14: error: incompatible types
this.current.value=x;
^
required: T#2
found: T#1
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>add(T#1)
T#2 extends Object declared in class LinkedList
linkedlist.java:25: error: incompatible types
node<T> y=head;
^
required: node<T#2>
found: node<T#1>
where T#1,T#2 are type-variables:
T#1 extends Object declared in class LinkedList
T#2 extends Object declared in method <T#2>remove()
linkedlist.java:32: error: incompatible types
last=y;
^
required: node<T#2>
found: node<T#1>
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>remove()
T#2 extends Object declared in class LinkedList
3 errors
我知道这个错误是由于在这种情况下T可以是不同的类型,但我不知道如何纠正它。
答案 0 :(得分:3)
您需要从<T>
和add
方法的声明中删除remove
,因为通过编写类似
public <T> void add (T x)
你正在保存变量x可以是任何类型的T并且那很好但是当你试图在这个方法中进行赋值时会出现问题
this.current.value=x;
您的类型不兼容,current
的类型与x
的类型不同,为什么?因为T
声明中使用的current
与T
声明中使用的x
不同,这就是您收到错误的原因。删除<T>
,它应该有效
public void add(T x)
{
this.current.value=x;
this.current.next=null;
last.next=this.current;
last=this.current;
if(no==0)
head=this.current;
no++;
}
public T remove()
{
node<T> y=head;
while(y.next.next!=null)
{
y=y.next;
}
T z =y.next.value;
y.next=null;
last=y;
return z;
}
同样在静态变量声明中
static node<T> head,last;
你有编译错误,因为 LinkedList.this无法从静态上下文中引用