Han*_*Sun 1 java generics types
我的编译器是JDK 6.0_65,以下是我的代码(Deque.java):
import java.util.Iterator;
public class Deque<Item> implements Iterable<Item> {
private Node first;
private Node last;
private class Node {
Item value;
Node next;
}
public Deque(){} // construct an empty deque
public Iterator<Item> iterator() {
// return an iterator over items in order from front to end
return new DequeIterator<Item>();
}
private class DequeIterator<Item> implements Iterator<Item> {
private Node current = first;
public boolean hasNext() {
return current.next != null;
}
public Item next() {
Item item = current.value;
current = current.next;
return item;
}
public void remove() {}
}
public static void main(String[] args) {
// unit testing
Deque<Integer> dq = new Deque<Integer>();
}
}
Run Code Online (Sandbox Code Playgroud)
在外部范围内:
public class Deque<Item> implements Iterable<Item> {
Run Code Online (Sandbox Code Playgroud)
用来.
在内在范围内:
private class DequeIterator<Item> implements Iterator<Item> {
Run Code Online (Sandbox Code Playgroud)
用来.
在范围内DequeIterator.笔者预计本地范围(内部类的范围)Item将影子类作用域Item的Deque<Item>.
但是,在编译阶段,javac会抛出这样的错误:
Deque.java:2: error: incompatible types
Item item = current.value;
^
required: Item#2
found: Item#1
where Item#1,Item#2 are type-variables:
Item#1 extends Object declared in class Deque
Item#2 extends Object declared in class Deque.DequeIterator
Run Code Online (Sandbox Code Playgroud)
它说,Item#2和Item#1是不兼容的类型,它看起来相当混乱到我,因为我已经通过了类型参数Item为DequeIterator使用new DequeIterator<Item>().
有没有人对此有任何想法?
我期望局部范围(内部类范围)
Item将遮蔽类范围ItemDeque<Item>
这基本上就是发生的事情 - 内部范围Item遮蔽了外部范围.你将外部传递Item给构造函数并不重要.内部类有编译问题,因为你试图将类型为outer的值赋给inner-类型Item的变量Item.
要解决这个问题,只需使嵌套类非泛型:
private class DequeIterator implements Iterator<Item>
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您将使用外部 - Item而无需声明Item您不需要的另一个类型参数.
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |