Je fournis des classes de facade pour une API tierce et j'ai besoin d'envelopper un itérateur afin de pouvoir remplacer ce qui est itéré par mon propre API. objet de façade.Comment placer un java.util.Iterator pour changer le type d'objet itéré
Voici une version simplifiée de ma classe de façade qui enveloppe une classe API appelée Item
class FacadeItem {
Item item;
FacadeItem(Item item) {
this.item = item;
}
}
L'API fournit un itérateur de cette forme Iterator<Item>
Je dois mettre en œuvre un itérateur de ce formulaire Iterator<FacadeItem>
qui est soutenu par l'itérateur de l'API.
Je considère en utilisant la ForwardingIterator de la bibliothèque goyave comme suit:
class FacadeItemIterator<FacadeItem> extends ForwardingIterator<Item> {
final Iterator<Item> delegate; // backing iterator
FacadeItemIterator(Iterator<Item> delegate) {
this.delegate = delegate;
}
@Override protected Iterator<Item> delegate() {
return delegate;
}
@Override
public FacadeItem next() {
return new FacadeItem(super.next());
}
}
mais la neutralisation de next()
n'est pas autorisée par le compilateur parce qu'il attend le type retourné à être article, non FacadeItem
Excellente réponse. Par souci d'exhaustivité, je mentionnerai simplement pour ceux qui pourraient en venir là plus tard que les "deux autres méthodes" que vous devez remplacer dans votre première solution sont hasNext() et remove() –