这个java程序有错误吗?

时间:2014-09-20 05:32:48

标签: java generics error-handling

我正在尝试为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可以是不同的类型,但我不知道如何纠正它。

1 个答案:

答案 0 :(得分:3)

您需要从<T>add方法的声明中删除remove,因为通过编写类似

的内容
public <T> void add (T x)

你正在保存变量x可以是任何类型的T并且那很好但是当你试图在这个方法中进行赋值时会出现问题

this.current.value=x;

您的类型不兼容,current的类型与x的类型不同,为什么?因为T声明中使用的currentT声明中使用的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无法从静态上下文中引用