如何使用迭代器来获取一堆整数?如果我使用Objects而不是int,我的代码适用于语句。如果我使用对象的for语句它工作。它与Integer自动装箱有什么关系吗?
public class Simulator {
public static void main(String[] args) {
Stack<Integer> s = new Stack<Integer>();
s.insert(15);
s.insert(25);
s.insert(7);
for ( int t : s) {
System.out.println(t);
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package stack;
import java.util.Iterator;
/**
*
* @author
*/
public class Stack<Item> implements Iterable {
/**
* @param args the command line arguments
*/
private Item[] arr;
private int n;
public Stack() {
System.out.println("Stack initialized");
arr = (Item[]) new Object[1];
n = 0;
}
public void insert(Item element) {
if (n == arr.length) {
resize(arr.length * 2);
}
arr[n++] = element;
}
@Override
public Iterator iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator<Item> {
private int i = n;
@Override
public boolean hasNext() {
return i > 0;
}
@Override
public Item next() {
return arr[--i];
}
@Override
public void remove() {
}
}
// resize the underlying array holding the elements
private void resize(int capacity) {
assert capacity >= n;
Item[] temp = (Item[]) new Object[capacity];
for (int i = 0; i < n; i++) {
temp[i] = arr[i];
}
arr = temp;
}
}
答案 0 :(得分:7)
第一个问题是您的Stack
课程。它只是实现了原始的Iterable
类型。它应该实现Iterable<Item>
。阅读Java Generics FAQ中有关原始类型的更多信息。
您仍然无法创建Stack<int>
,但使用Stack<Integer>
并使用int
迭代变量进行迭代的代码可以正常使用。
将类声明更改为:
class Stack<Item> implements Iterable<Item>
并将iterator
方法更改为:
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
...由于您的数组转换(实际上没有检查任何内容),您仍会得到lint警告,但其余部分应该没问题。