我有以下两个班级
import java.util.*;
public interface Stack<Item> extends Iterable<Item>{
void push(Item item);
Item pop();
boolean isEmpty();
int size();
Iterator<Item> iterator();
}
第二课是:
import java.util.*;
public class LinkedStack<Item> implements Stack<Item>{
private Node head;
private int size;
private class Node{
Item item;
Node next;
public Node(Item item){
this.item = item;
}
public Node(Item item, Node next){
this.item = item;
this.next = next;
}
}
public boolean isEmpty(){
return(head == null);
}
public int size(){
return size;
}
public void push(Item item){
head = new Node(item,head);
size++;
}
public Item pop(){
Item item = head.item;
head = head.next;
size--;
return item;
}
public Iterator<Item> iterator(){
return new LinkedStackIterator<Item>();
}
class LinkedStackIterator<Item> implements Iterator<Item>{
private Node current = head;
public boolean hasNext(){
return current != null;
}
public Item next(){
Item return_item = current.item;
current = current.next;
return return_item;
}
public void remove(){};
}
}
我在方法public Item next()
中遇到了类型错误:
Item return_item = current.item;
如果我将上面的行写为
Item return_item = (Item) current.item;
工作正常。任何人都可以提出原因吗?
我遇到编译错误:
LinkedStack.java:57:错误:不兼容的类型 项目return_item = current.item; ^ 要求:项目#2 发现:项目#1 其中Item#1,Item#2是类型变量: Item#1扩展了在LinkedStack类中声明的Object Item#2扩展了在LinkedStack.LinkedStackIterator类中声明的Object 1错误
答案 0 :(得分:1)
由于您的LinkedStackIterator
类是通用的,因此当它引用Item
时,它表示与您的外部类中使用的Item
不同的类型。一种解决方案是更改LinkedStackIterator
,因此它不是通用的,即更改:
class LinkedStackIterator<Item> implements Iterator<Item>{
到
class LinkedStackIterator implements Iterator<Item>{
旁注:Java程序员看到泛型类型变量(如Item
这样有意义的名称可能会让人感到困惑。您可能希望考虑将其重命名为更期望的内容,例如T
。