Come esempio pratico della questione generale in materia, vorrei implementare il metodo containsAll
nell'interfaccia Set
conattuazione Interfaccia con metodo argomento superclassi
public boolean containsAll(Iterable<?> c) { /* ... */ }
immagino questo dovrebbe essere consentito, poiché Collection
è Iterable
che significa che un tale containsAll
coprirebbe i requisiti dell'interfaccia. Allo stesso modo, più generalmente la possibilità di implementare interfacce con superclassi di argomenti sembra che dovrebbe funzionare.
Tuttavia, Eclipse non dice in alcun modo (non ho provato solo javac straight-up) - qualcuno può spiegarne il motivo? Sono sicuro che ci sia qualcosa nelle specifiche che lo rende così com'è, ma mi piacerebbe capire anche la motivazione del requisito. O mi manca qualcosa come Iterable<?>
non essendo una superclasse di Collection<?>
?
Come una domanda a parte: dato che sto dichiarando due metodi, il metodo con la firma Iterable
sarà sempre preferito per le chiamate con un argomento Collection
?
Eclipse Errore:
Se rimuovo il metodo con la firma Collection
, semplicemente lasciando il Iterable
uno (vedere dopo errore), ottengo il seguente:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
L'esatta essere implementazione :
@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;
}
Potresti pubblicare un errore che Eclipse ti sta dando? Lavora per me in IDEA. –
@Nikita: modificato in. Soooo ... potrebbe essere solo una cosa di Eclipse? – Carl
Questo è un incubo terminologico. Fuggo da queste sfide. – skaffman