不兼容的类型错误。发现需要java.lang.Object:Item

时间:2014-06-18 20:57:37

标签: java generics

我按如下方式编写通用代码:

class Link<Item>
   {
      public Item dData;
      public Link next;
      public Link(Item d)
       {
         dData=d;
       }
     public void displayLink()
       {
         System.out.println(dData);
       }
    }
   ............
   Link delete=first;
   1>Item temp=delete.dData;// This code gives the error(mentioned at the title)
   2>Item temp=(Item)delete.dData; //This code works fine (With a warning no error)

为什么第1行会出错{不兼容的类型错误。发现需要java.lang.Object:Item},当下面的代码工作得很好时?

  public class Stack<Item>
   {
     private Node first = null;
     private class Node
      {
        Item item;
        Node next;
      }
     public boolean isEmpty()
      {      return first == null; }
     public void push(Item item)
      {
        Node oldfirst = first;
        first = new Node();
        first.item = item;
        first.next = oldfirst;
      }
     public Item pop()
      {
        Item item = first.item;// This statement works fine, then why not statement 1?
        first = first.next;
        return item;
      }
    }

1 个答案:

答案 0 :(得分:4)

您在Item课程中使用Link作为通用类型参数。但是,当您使用LinkLink delete=first;等代码时,使用public Link next;的代码会使用类的原始形式。当使用类的 raw 形式时,类中的所有泛型,甚至是不相关的泛型,都会进行类型擦除。您的public Item dData;现已有效public Object dData;,您无法在不投标的情况下将Object分配给Item

第二个代码有效,因为泛型类型参数Item在范围内,您无法访问dData并依赖其类型。

此外,将通用类型参数命名为与现有名称相同的名称也是一个坏主意。通常,泛型类型参数是单个大写字母,例如

class Link<T>

此外,在其他地方使用该泛型类型参数。

public T dData;
public Link<T> next;
public Link(T d)
{
   dData=d;
}

而不是Link delete=first;,请尝试Link<T> delete=first;