Comment puis-je résoudre ambigu méthodes causée par intersection types en Java génériques?

Je viens de découvrir que vous pouvez spécifier plusieurs types dans un seul type de paramètre lié (voir l'exemple). Comme tout nouvel outil, j'ai essayé d'explorer les possibilités de comment cela peut être utilisé (et détourné). J'ai conçu cet exemple pour illustrer.

Sur l'exemple ci-dessous, le compilateur me donne une erreur

expédition(nouveau AlphabetSoup());

La méthode d'envoi(en Démo.Soupe) est ambigu pour le type de Démo

Je peux le comprendre, soit parce que la signature de la méthode correspond. Ma question est comment cela pourrait-il être résolu sans changer les méthodes? Si j'ai voulu forcer un appel à la Soupe version je pourrais abattu à la Soupe:

expédition((Soupe) de nouvelles AlphabetSoup())

Mais je n'en suis pas sûr comment vous pouvez forcer un appel à l'autre version. Est-il possible?

public class Demo {
interface HasA { public char getA(); }
interface HasB { public char getB(); }
interface HasC { public char getC(); }
interface Soup { 
public void eat();
}
class Alphabet implements HasA, HasB, HasC {
public char getA() { return 'a'; }
public char getB() { return 'b'; }
public char getC() { return 'c'; }
}
class AlphabetSoup implements Soup,  HasA, HasB, HasC  { 
public void eat() { System.out.println("Mmm Mmm Good!"); }
public char getA() { return 'a'; }
public char getB() { return 'b'; }
public char getC() { return 'c'; }
}
public void dispatch(Soup soup) {
System.out.println("Eating some soup...");
soup.eat();
}
public <T extends HasA & HasB & HasC> void dispatch(T letters) {
System.out.println("Reciting ABCs...");
System.out.println(letters.getA());
System.out.println(letters.getB());
System.out.println(letters.getC());
}
public void test() {
dispatch(new Alphabet());
dispatch(new AlphabetSoup());
}
public static void main(String[] args) {
new Demo().test();
}
}

--
Edit: Juste appris que "plusieurs délimitée paramètres de type sont officiellement dénommé "Intersection" Types de

  • Je crois que la seule façon possible d'appeler l'autre méthode dispatch est par l'aide de la réflexion.
InformationsquelleAutor Mark Renouf | 2009-05-02