我按如下方式编写通用代码:
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;
}
}
答案 0 :(得分:4)
您在Item
课程中使用Link
作为通用类型参数。但是,当您使用Link
和Link 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;
。