Wie zu werfen einen Iterator der Klasse einen Iterator, der einer Subklasse?

Versuchte ich warf einen Iterator der Klasse einen iterator, der eine Unterklasse der Klasse sagte. Dies gab mir ein "inconvertible types" Fehler. Warum ist dies nicht möglich, und was ist der eleganteste Weg das zu umgehen? (Oder alternativ, warum ist es eine schlechte Idee, wenn es ist?)

Mithilfe einer for-each-Schleife ist keine Lösung in diesem Fall: ich bin versucht zu implementieren iterator() und der einfachste Weg, dies zu tun wäre, um die Rückkehr der iterator() einer meiner Klasse " Felder, aber dass man nicht über den gewünschten Typ. Ich kann es nicht ändern, die Signatur von meinem iterator()entweder.

public interface SomeoneElsesInterface {
    public Iterator<SomeoneElsesInterface> iterator();
}

public abstract class MyAbstractClass implements SomeoneElsesInterface {
    final MyAbstractClass[] things;
    public MyAbstractClass(SomeoneElsesInterface... things) {
         this.things = (MyAbstractClass[]) things;
    }
}

public class MyClass extends MyAbstractClass {
    public MyClass(MyAbstractClass thing1, MyAbstractClass thing2) {
        super(thing1, thing2);
    }

    public Iterator<SomeoneElsesInterface>() {
        return (Iterator<SomeoneElsesInterface>) Arrays.asList(things).iterator();
    }
}

Konnte ich, natürlich, ändern Sie einfach die Art von things. Jedoch bräuchte ich eine Menge von Besetzungen in anderen Orten, in diesem Fall. Ich weiß, dass mein Konstruktor nicht aufgerufen werden, mit Gegenständen, die nicht MyAbstractClasss, aber ich kann nicht ändern das interface sowieso.

  • Was (wenn überhaupt etwas) ist die Beziehung zwischen dem Typ der Klasse und der Art der enthaltenen Feld? Können Sie uns zeigen, einige code?
InformationsquelleAutor Erik | 2012-07-15
Schreibe einen Kommentar