Ich habe vor kurzem entdeckt, dass Sie mehrere Typen in einer einzelnen Typparameterbindung angeben können (siehe Beispiel). Wie jedes neue Werkzeug habe ich versucht, die Möglichkeiten zu erkunden, wie dies genutzt (und missbraucht) werden kann. Ich habe dieses Beispiel zur Veranschaulichung erstellt.Wie behebe ich mehrdeutige Methoden, die durch Schnitttypen in Java-Generics verursacht werden?
auf der Probe unten wird der Compiler mir einen Fehler geben
dispatch (neue AlphabetSoup());
Die Methode dispatch (Demo.Soup) ist nicht eindeutig für den Typ Demo
Ich kann das verstehen, weil entweder Methodensignatur übereinstimmt. Meine Frage ist, wie kann das gelöst werden, ohne die Methoden zu ändern? Wenn ich wollte einen Aufruf an die Version Suppe zwingen, ich Suppe niedergeschlagenen könnte:
Versand ((Suppe) neue AlphabetSoup())
Aber ich bin nicht sicher, wie Sie einen Anruf zwingen würden zu der anderen Version. Ist es möglich?
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: gerade gelernt, dass „mehrere beschränkten Typs Parameter formal bezeichnet werden als‚Kreuzungstypen‘
Ich glaube, die einzige Möglichkeit, die andere Versandmethode aufzurufen, ist die Verwendung von Reflektion. –