Recientemente descubrí que puede especificar varios tipos en un solo parámetro de tipo vinculado (ver ejemplo). Como cualquier herramienta nueva, he estado tratando de explorar las posibilidades de cómo se puede usar (y mal). Diseñé este ejemplo para ayudar a ilustrar.¿Cómo puedo resolver los métodos ambiguos causados por los tipos de intersección en los genéricos de Java?
En el ejemplo siguiente, el compilador me da un error
despacho (nueva AlphabetSoup());
El método de envío (Demo.Soup) es ambiguo para la demostración de tipo
Puedo entender esto porque tampoco coincide con firma del método. Mi pregunta es ¿cómo podría resolverse esto sin cambiar los métodos? Si quería forzar una llamada a la versión sopa pude abatido en Soup:
envío ((sopa) nueva AlphabetSoup())
Pero estoy seguro de cómo le gustaría forzar una llamada a la otra versión. ¿Es posible?
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();
}
}
- Editar: acaba de aprender que "varios parámetros de tipo acotadas se denominan oficialmente 'los tipos de intersección'
Creo que la única manera posible de llamar al otro método de envío es mediante el uso de la reflexión. –