Comme un exemple concret de la question générale du sujet, je voudrais mettre en œuvre la méthode containsAll
dans l'interface Set
avecmise en œuvre Interface avec l'argument de la méthode SuperClasses
public boolean containsAll(Iterable<?> c) { /* ... */ }
Je figure cela devrait être permis, depuis Collection
est Iterable
ce qui signifie qu'un tel containsAll
couvrirait l'exigence d'interface. De même, plus généralement, être capable d'implémenter des interfaces avec des superclasses d'arguments semble fonctionner. Cependant, Eclipse ne dit pas du tout (n'a pas essayé juste javac straight-up) - quelqu'un peut-il expliquer la raison de cela? Je suis sûr qu'il y a quelque chose dans la spécification qui fait que c'est comme ça, mais je voudrais comprendre la motivation pour l'exigence aussi bien. Ou est-ce que je manque quelque chose comme Iterable<?>
n'étant pas une superclasse de Collection<?>
? Comme une question secondaire - étant donné que je déclare deux méthodes serait la méthode avec la signature Iterable
toujours préférée sur les appels avec un argument Collection
?
Eclipse Erreur:
Si je supprime la méthode avec la signature Collection
, tout en laissant le Iterable
un (voir après erreur), je reçois le texte suivant:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
L'être de mise en œuvre exacte :
@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;
}
Pourriez-vous poster une erreur qu'Eclipse vous offre? Travaille pour moi à IDEA. –
@Nikita: édité dans. Soooo ... ça pourrait être juste une chose Eclipse? – Carl
Celui-ci est un cauchemar terminologique. Je fuis de tels défis. – skaffman