Als praktisches Beispiel für die allgemeine Frage in diesem Thema, würde Ich mag die containsAll
Methode in der Set
Schnittstelle mitInterface-Implementierung mit Methode Argument Super
public boolean containsAll(Iterable<?> c) { /* ... */ }
ich dies sollte erlaubt sein Abbildung implementieren, da Collection
ist Iterable
Bedeutung so ein containsAll
würde die Schnittstellenanforderung abdecken. Ebenso scheint es im Allgemeinen möglich zu sein, Interfaces mit Superklassen von Argumenten zu implementieren.
Allerdings sagt Eclipse nicht (habe nicht gerade javac ausprobiert) - kann jemand den Grund dafür erklären? Ich bin mir sicher, dass es etwas in der Spezifikation gibt, das es so macht, wie es ist, aber ich würde gerne auch die Motivation für die Anforderung verstehen. Oder fehlt mir etwas wie Iterable<?>
nicht eine Oberklasse von Collection<?>
?
Als eine Nebenfrage - gegeben ich zwei Methoden deklarieren würde die Methode mit der Iterable
Signatur immer auf Anrufe mit einem Collection
Argument bevorzugt werden?
Eclipse-Fehler:
Wenn ich entfernen Sie die Methode mit dem Collection
Unterschrift, nur verlassen die Iterable
ein (siehe nach Fehler), erhalte ich folgendes:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
Die genaue Wesen Umsetzung :
@Override public boolean containsAll(Collection<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
public boolean containsAll(Iterable<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
Konnten Sie einen Fehler bekannt geben, den Eclipse Ihnen gibt? Funktioniert für mich in IDEA. –
@Nikita: bearbeitet in. Soooo ... könnte es nur eine Eclipse-Sache sein? – Carl
Dies ist ein Begriff Alptraum. Ich laufe vor solchen Herausforderungen davon. – skaffman