Como un ejemplo práctico de la cuestión general en el tema, me gustaría poner en práctica el método containsAll
en la interfaz Set
conaplicación de interfaz con el argumento de un método superclases
public boolean containsAll(Iterable<?> c) { /* ... */ }
Calculo esto se debe permitir, ya Collection
es Iterable
significando que containsAll
cubriría el requisito de interfaz. Del mismo modo, en general, ser capaz de implementar interfaces con superclases de argumento parece que debería funcionar.
Sin embargo, Eclipse dice que no, de ninguna manera (no lo han intentado solo con javac): ¿alguien puede explicar el motivo? Estoy seguro de que hay algo en la especificación que lo hace tal como es, pero también me gustaría entender la motivación para los requisitos. ¿O me estoy perdiendo algo como Iterable<?>
que no es una superclase de Collection<?>
?
Como una pregunta complementaria: dado que declaro dos métodos, ¿el método con la firma Iterable
siempre se preferirá en llamadas con un argumento Collection
?
Eclipse error:
Si quito el método con la firma Collection
, acaba de salir de la Iterable
uno (ver después de un error), me sale el siguiente:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
El ser exacta aplicación :
@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;
}
¿Podría publicar un error que Eclipse le está dando? Funciona para mí en IDEA. –
@Nikita: editado en. Tan ... ¿podría ser algo de Eclipse? – Carl
Esta es una pesadilla de terminología. Me escapo de tales desafíos. – skaffman