如何将原语与迭代器一起使用

时间:2013-10-11 15:18:31

标签: java

如何使用迭代器来获取一堆整数?如果我使用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;           
    }
}

1 个答案:

答案 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警告,但其余部分应该没问题。