2014-03-30 11 views
12

Ich habe eine Klasse, die Set und List implementiert. Programme funktionieren in Java6 und Java7 einwandfreiKlasse erbt nicht verwandte Standardwerte für spliterator() von den Typen java.util.Set und java.util.List

public class SetList<V> implements Set<V>, List<V> 
{ 
    .... 
} 

Mit Java 8 kompiliert das nicht. Fehler

java: Klasse trials.SetList nicht verwandten Standardwerte für spliterator erbt() von Typen java.util.Set und java.util.List

java/util/Set.java: 394

... 
@Override 
default Spliterator<E> spliterator() { 
    return Spliterators.spliterator(this, Spliterator.DISTINCT); 
} 

java/util/List.java

... 
@Override 
default Spliterator<E> spliterator() { 
    return Spliterators.spliterator(this, Spliterator.ORDERED); 
} 

Doe Bedeutet es, dass ich keine Klasse haben kann, die sowohl Set als auch List in Java 8 implementiert? (Es sieht aus wie die Zeit gekommen ist, unsere technischen Schulden zu bezahlen.)

+5

Stellen Sie Ihre eigene Implementierung von 'spliterator()'. –

+6

Wie kann eine Klasse Set und List implementieren? Sie haben widersprüchliche Verträge. Das klingt nach einer wirklich schlechten Idee. –

+0

@Stirios Delimanolis - danke, das ist wahrscheinlich die _answer_. – Jayan

Antwort

10

Während es ungewöhnlich ist, dass eine Klasse sowohl implementiert List und Set, gibt es einige Situationen, in denen ein Set auch List ist eine etwas eingeschränkte unterstützen kann.

Persönlich bevorzuge ich in diesen Fällen eine asList() Methode zu deklarieren, anstatt sowohl List als auch Set gleichzeitig zu implementieren. Etwas wie folgt aus:

public class SetList<V> implements Set<V> { 
    public List<V> asList(){ 
     // return a list representation of this Set 
    } 
} 

Auf der anderen Seite, wenn Sie bereits eine vorhandene Klasse haben, das implementiert sowohl List und Set, dann ist die einfachste Lösung für Ihr Problem ist vielleicht explizit eine der Super spliterator() Methoden aufrufen:

public class SetList<V> implements Set<V>, List<V> { 
    @Override 
    public Spliterator<V> spliterator() { 
     return List.super.spliterator(); 
    } 
} 
3

Dies ist Diamond Problem that causes in Multiple inheritance.

Das „diamond-Problem“ (manchmal bezeichnet als „tödlicher Diamant death“) ist eine Zweideutigkeit, die B und C vererben A und Klasse D erben beide von B und C, wenn zwei Klassen entstehen, Wenn es eine Methode in A gibt, die B und C überschrieben haben, und D sie nicht überschreibt dann welche Version der Methode erbt: die von B, oder die von C?

In Java, Kompilierungsfehler verhindert dieses Problem. Um dies zu beheben, sollten Sie eine implementieren