Je sais qu'il y a toutes sortes de contre-intuitive, les propriétés de Java les types génériques. Voici l'un en particulier que je ne comprends pas, et qui, je l'espère, quelqu'un peut m'expliquer. Lors de la spécification d'un paramètre de type pour une classe ou une interface, vous pouvez liés de sorte qu'il doit implémenter plusieurs interfaces avec d' public class Foo<T extends InterfaceA & InterfaceB>
. Toutefois, si vous êtes l'instanciation d'un objet réel, cela ne fonctionne pas plus. List<? extends InterfaceA>
est bien, mais List<? extends InterfaceA & InterfaceB>
ne parvient pas à compiler. Considérez les points suivants complet extrait:
import java.util.List;
public class Test {
static interface A {
public int getSomething();
}
static interface B {
public int getSomethingElse();
}
static class AandB implements A, B {
public int getSomething() { return 1; }
public int getSomethingElse() { return 2; }
}
// Notice the multiple bounds here. This works.
static class AandBList<T extends A & B> {
List<T> list;
public List<T> getList() { return list; }
}
public static void main(String [] args) {
AandBList<AandB> foo = new AandBList<AandB>(); // This works fine!
foo.getList().add(new AandB());
List<? extends A> bar = new LinkedList<AandB>(); // This is fine too
// This last one fails to compile!
List<? extends A & B> foobar = new LinkedList<AandB>();
}
}
Il semble que la sémantique de l' bar
devraient être bien définies, je ne peux pas penser de la perte de tout type de sécurité en permettant à une intersection de deux types, plutôt qu'un seul. Je suis sûr qu'il ya une explication. Personne ne sait ce que c'est?