Итератор по массиву
Доброго времени суток.
Учу итераторы, и практикуюсь. Задача сделать итератор по массиву. Код правильный(вроде). Но при создание с Integer, программа просит сменить обобщенный тип на int[] (T[] -> int[]). Хотя со String всё нормально.
Q73:
package com.company;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Q73<T> implements Iterator<T> {
private T[] array;
private int index = 0;
Q73(T[] array) { this.array = array; }
@Override
public boolean hasNext() { return index < array.length; }
@Override
public T next() {
if(!hasNext()) { throw new NoSuchElementException(); }
return array[index++];
}
}
Код в Main:
int[] arrayInt = new int[]{1,1,1,1,1,23,123,4,1,4,124,1};
String[] arrayString = new String[]{"as","as","dsd","41","12"};
Q73<String> Q = new Q73(arrayString);
Q73<Iterator> Q2 = new Q73(arrayInt);
Ругается на Q73 Q2 = new Q73(ARRAYINT).
Заранее спасибо.
Ответы (1 шт):
Generics в Java - это полностью компиляция - компилятор превращает все общие применения в приведения в правильный тип. Это должно поддерживать обратную совместимость с предыдущими запусками JVM.
Это:
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
превращается в (грубо):
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
Итак, все, что используется как generics, должно быть преобразовано в Object (в этом примере get(0) возвращает Object), а примитивные типы - нет. Поэтому они не могут использоваться в дженериках.
Поэтому если вы хотите работать с примитивами, вы должны использовать их обертки:
- byte -> Byte
- int -> Integer
- short -> Short
- long -> Long
- float -> Float
- double -> Double
- boolean -> Boolean
- char -> Character
Например:
Integer [] ints;