2016-04-28 11 views
5

Also habe ich eine Klasse die ich gemacht habe die ich sortieren wollte. Um dies zu tun, habe ich es einfach die Collection-Schnittstelle implementieren, so dass es in der Collections-Klasse verwendet werden kann.Ist es möglich, sowohl einen ListIterator als auch eine Collection in Java zu implementieren?

Jetzt habe ich bemerkt, dass die Klasse selbst nur ein Sprung ist, überspringen, und ein Sprung weg von einem ListIterator und es wäre nett, sie auch diese Schnittstelle zu implementieren (Blick in die Zukunft auf diesem). Es gibt ein Problem, aber, und das ist, dass es ein Verfahren Konflikt zwischen der Collection-Schnittstelle und ListIterator Schnittstelle ist:

// from the Collection interface: 
public boolean add(E someElement); 

// from the ListIterator interface: 
public void add(E someElement); 

Ist es möglich, haben eine Klasse für beide Schnittstellen entsprechen? Wenn nicht, bedeutet das, dass sich diese beiden Schnittstellen gegenseitig ausschließen?

+2

Ich würde zuerst fragen, warum Sie das Gefühl haben, Sie beide brauchen. Wenn die Sammlung das tut, was Sie brauchen, warum sollten Sie die zusätzliche Anforderung von ListIterator hinzufügen? Ich versuche immer, den Code nicht zu komplizieren, es sei denn, ich habe einen funktionalen Grund dafür. – Kurtymckurt

+0

Dies wird eine Listengruppe sein, die ich ziemlich oft in diesem Job verwenden werde, und ich sehe in der Zukunft die Möglichkeit, einen ListIterator daraus zu machen. Die von mir erstellte Lösung sollte eine Methode erstellen, die einen ListIterator der Daten zurückgibt. Nicht die anmutigste Lösung, aber eine Lösung nichtsdestotrotz ... –

+0

Wäre es nicht gut, die 'AbstractList' Klasse eher zu erweitern. Sie können sich "ArrayList", "LinkedList" Implementierungen ansehen und wie sie das gleiche Problem lösen. – soufrk

Antwort

5

Ja, leider schließen sie sich gegenseitig aus.

Wenn Sie eine (abstrakte) Klasse erstellen, die beide zu implementieren versucht, erhalten Sie einen Compilerfehler.

Main.java:16: error: types ListIterator and Collection are incompatible; both define add(java.lang.Object), but with unrelated return types
abstract class Foo implements Collection, ListIterator

4

Sie haben Recht, Sie können nicht beide implementieren. Aber um ehrlich zu sein, warum willst du das machen?

Wenn Sie eine ListIterator freilegen müssen, warum fügen Sie keine Methode hinzu, die einen zurückgibt?

List die Collection beispielsweise erstreckt sich nicht ListIterator erstrecken, hat es ein Verfahren listIterator genannt, die den Iterator zurückgibt.

ListIterator<E> listIterator(); 

Halten Sie etwas im Auge, ein Collection ist kein Iterator, ein Collection ist ein Iterable.

+1

Und das ist, was ich getan habe. :) –

0

Wie andere sagten, ist es nicht möglich, beide in einer Klasse zu haben.

Aber die Semantik eines ListIterator, ein Iterator ist, verbietet dies dennoch: ein Collection etwas, das man so oft durchlaufen können, wie Sie wollen, während ein Iterator etwas one-shot ist das, wenn Sie über sie iteriert haben , kann weggeworfen werden (oder im Fall einer ListIterator, möglicherweise zurückgespult und wiederverwendet werden, aber das ist nicht der Standard-Anwendungsfall).

Verwandte Themen