2013-08-25 96 views
4

以下代碼不起作用。這段代碼有什麼問題?編譯器在for循環中抱怨NumberList不是Iterable類。for-each循環只能遍歷數組或java.lang.Iterable的實例

什麼樣的類可以用於for-each循環?如何使NumberList可迭代?我試着製作NumberList implement Iterable,但它似乎不工作,因爲我不知道如何正確定義Iterator。

如果有人能演示如何使這段代碼工作,或者將我鏈接到一個很棒的教程。

public class Test{ 
    public class NumberList{ 
     private int numItems; 
     private Number[] numbers; 

     public NumberList(int size){ 
      this.numbers = new Number[size]; 
      this.numItems=0; 
     } 

     public void add(Number n){ 
      this.numbers[this.numItems++]=n; 
     } 
    } 

    public void printPairs() { 
     ArrayList<Integer> num=new ArrayList<Integer>(); 

     NumberList numbers = new NumberList(50); 
     numbers.add(4); 
     numbers.add(5); 
     numbers.add(6); 

     for(Number n1: numbers){ 
      System.out.println(n1); 
     } 
    } 
} 
+3

爲什麼你定義自己的列表,而不是使用一個ArrayList? –

+0

首先,肯定使用JDK附帶的列表。正如前面的評論者所說,沒有用來定義你自己的。但是如果你想修復你的代碼,編譯器給了你答案。只需實現Iterable並填寫所需的方法。 –

+0

還有其他關於如何實現Iterable的問題,包括[實現Iterable接口](http://stackoverflow.com/questions/6050379/implementing-the-iterable-interface)。 –

回答

4

NumberList不實現Iterable。就編譯器而言,它只關心其他任何類。

你需要做這樣的事情

public class NumberList implements Iterable<Number> { 

    private int numItems; 
    private Number[] numbers; 

    public NumberList(int size) { 
     this.numbers = new Number[size]; 
     this.numItems = 0; 
    } 

    public void add(Number n) { 
     this.numbers[this.numItems++] = n; 
    } 

    @Override 
    public Iterator<Number> iterator() { 
     return Arrays.asList(numbers).subList(0, numItems).iterator(); 
    } 
} 
+0

答案很好,但是說明了這個練習的無用性:你擁有的只是一個很薄的代表層,沒有增加任何值。 – Bohemian

+0

答案並不好,因爲迭代器遍歷數組的所有元素,而不僅僅是遍歷第一個numItems元素。 –

+1

@JB你當然是對的,更新的答案。有了這些愚蠢的玩具的例子,它很容易被誤解成一種錯誤的意識,你不能誤解它。 – monkjack

0

您需要implementIterable interface。在這種情況下,這意味着您需要將方法Iterator<T> iterator()添加到您的NumberList類中。由於您的列表只包含這種情況下的數字,所以通用類型參數T只是Number

3

NumberList類需要實現Iterable接口:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 

public class Test { 
    public class NumberList implements Iterable<Number> { 
     private int numItems; 
     private Number[] numbers; 

     public NumberList(int size) { 
      this.numbers = new Number[size]; 
      this.numItems = 0; 
     } 

     public void add(Number n) { 
      this.numbers[this.numItems++] = n; 
     } 

     @Override 
     public Iterator<Number> iterator() { 
      return Arrays.asList(numbers).iterator(); 
     } 

    } 

    public void printPairs() { 

     ArrayList<Integer> num = new ArrayList<Integer>(); 

     NumberList numbers = new NumberList(50); 
     numbers.add(4); 
     numbers.add(5); 
     numbers.add(6); 

     for (Number n1 : numbers) { 
      System.out.println(n1); 
     } 
    } 
}  
+0

我有個問題,爲什麼「implements Iterable 」需要泛型?爲什麼我不能把它作爲Iterable?在我的編譯器中,似乎我可以將迭代器方法保留爲原始類型,但需要在「實現」中將作爲泛型類型。 – turtlesoup

+4

@Jimster如果你實現原始的'Iterable'而不是'Iterable',那麼你只能說'for(Object o:numbers)',編譯器會拒絕'for(Number n:numbers)' –

+0

In一般來說,即使編譯器會允許你,如果有其他選擇,將任何東西都保留爲原始類型永遠不是一個好主意。 –

相關問題