classe générique mise en œuvre Iterable
Question
Je veux avoir une classe générique qui implémente Iterable (Appelons-ImplIterable) de type T qui implémente une interface Iterable sur une certaine classe (qui ne sont pas du type de classe générique); par exemple:
public class ImplIterable <T> implements Iterable<A> {
private A[] tab;
public Iterator<A> iterator() {
return new ImplIterator();
}
// doesn't work - but compiles correctly.
private class ImplIterator implements Iterator<A> {
public boolean hasNext() { return true; }
public A next() { return null; }
public void remove() {}
}
}
Où A est une classe. Maintenant, ce code ne compilera pas:
ImplIterable iable = new ImplIterable();
for (A a : iable) {
a.aStuff();
}
Mais cette volonté:
Iterable<A> = new ImplIterable();
for (A a : iable) {
a.aStuff();
}
Je ne comprends pas pourquoi ce dernier ne compile pas et pourquoi je ne peux pas itérer sur ImplIterable si correctement met en œuvre itérables. Ai-je fait quelque chose de mal / est-il une solution à ce type de problèmes?
La solution
Lorsque vous utilisez une classe générique sans paramètre générique, tous les génériques de cette catégorie sont désactivées.
Depuis ImplIterable
est générique, et que vous utilisez comme une classe non générique, les paramètres génériques l'intérieur de celui-ci disparaissent, et il devient un Iterable
(non générique) de Object
s.