2015-06-06 2 views
1

Я не понимаю эту линию:Oracle Внутренние классы Пример

interface DataStructureIterator extends java.util.Iterator<Integer> { } 

, так как нет никакой разницы между DataStructeIterator и итератора мы не можем просто удалить эту строку и вместо того, чтобы сказать:

private class EvenIterator implements java.util.iterator<Integer> { //code goes here} 

Что мне не хватает?

public class DataStructure { 

    // Create an array 
    private final static int SIZE = 15; 
    private int[] arrayOfInts = new int[SIZE]; 

    public DataStructure() { 
     // fill the array with ascending integer values 
     for (int i = 0; i < SIZE; i++) { 
      arrayOfInts[i] = i; 
     } 
    } 

    public void printEven() { 

     // Print out values of even indices of the array 
     DataStructureIterator iterator = this.new EvenIterator(); 
     while (iterator.hasNext()) { 
      System.out.print(iterator.next() + " "); 
     } 
     System.out.println(); 
    } 

    interface DataStructureIterator extends java.util.Iterator<Integer> { } 

    // Inner class implements the DataStructureIterator interface, 
    // which extends the Iterator<Integer> interface 

    private class EvenIterator implements DataStructureIterator { 

     // Start stepping through the array from the beginning 
     private int nextIndex = 0; 

     public boolean hasNext() { 

      // Check if the current element is the last in the array 
      return (nextIndex <= SIZE - 1); 
     }   

     public Integer next() { 

      // Record a value of an even index of the array 
      Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]); 

      // Get the next even element 
      nextIndex += 2; 
      return retValue; 
     } 
    } 

    public static void main(String s[]) { 

     // Fill the array with integer values and print out only 
     // values of even indices 
     DataStructure ds = new DataStructure(); 
     ds.printEven(); 
    } 
} 
+0

Это учебник Oracle? Шутки в сторону. Кто пишет 'nextIndex <= SIZE - 1'? – ZhongYu

ответ

1

Да, вы правы; для большинства целей вы можете покончить с DataStructureIterator и напрямую использовать Iterator<Integer>.

Определение DataStructureIterator как это создает сокращенную нотацию для Iterator<Integer>, но это очень беден сокращенная. Это не совсем, как, например, ЬурейеЕ в С.

Вы можете назначить любой объект, который реализует DataStructureIterator к Iterator<Integer>, но вы не можете назначить все объекты, которые реализуют Iterator<Integer> к DataStructureIterator.

Таким образом, хотя это и является законным для определения пустого интерфейса, это не так много смысла. И это может привести к путанице.

+0

Спасибо, что разобрался. И для второй части я думаю, что я догадался, почему мы не можем назначить Object из Iterator DataStructureIterator, и это связано с тем, что компилятор не знает, совпадает ли интерфейс DataStructureIterator с Iterator

Смежные вопросы