Не перебирает класс, реализующий Iterable - PullRequest
0 голосов
/ 13 июня 2019

Приведенный ниже код не дает мне скомпилировать, выдавая следующую ошибку: "foreach не относится к типу 'Bag <\ java.lang.Integer>'".

Я не понимаю, в чем проблема, потому что класс "Bag" реализует "Iterable", поэтому, я думаю, цикл должен рассматривать "Bag" как "Iterable". Пожалуйста, не могли бы вы прояснить ситуацию для меня?

class Bag<Item> implements Iterable<Item> {
private Node first;

private class Node {
    Item item;
    Node next;
}

public void add(Item item) {
    Node oldfirst = first;
    first = new Node();
    first.item = item;
    first.next = oldfirst;
}

public Iterator<Item> iterator() {
    return new ListIterator();
}

private class ListIterator implements Iterator<Item> {
    private Node current = first;

    public boolean hasNext() {
        return current != null;
    }

    public void remove() {}

    public Item next() {
        Item item = current.item;
        current = current.next;
        return item;
    }

}

public static void main(String[] args) {
    Bag<Integer> a = new Bag();
    a.add(5);
    a.add(10);
    for (int w : a) {
        System.out.println(w.iterator());
    }
 }
}

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Проблемы были в вашем main методе.После нескольких простых исправлений это работает:

public static void main(String[] args) {
    Bag<Integer> a = new Bag<>();
    a.add(5);
    a.add(10);
    for (int w : a) {
        System.out.println(w);
    }
}

Во-первых, Bag инициализация - <> отсутствовала, без меня не скомпилировалась.

Затем в println,Вы не можете вызвать w.iterator(), потому что w - это int, у которого нет такого метода.Не уверен, что ты хотел достичь с этим там.

0 голосов
/ 13 июня 2019
public static void main(String[] args) {
    Bag<Integer> a = new Bag();
    a.add(5);
    a.add(10);
    for (int w : a) {
        System.out.println(w);
    }
}

Вы не можете перебирать целые числа.его используют для итерации коллекции.Вам просто нужно изменить System.out.println (w);

И если вы в Java 8, то вы можете напрямую итерировать с помощью

a.iterator().forEachRemaining(n -> System.out.println(n));
...