Ich habe Probleme mit der Methodenreferenz in Kombination mit generischen Typen.
Wir haben Code, in dem wir eine überladene Methode aufrufen müssen, aber sie schlägt mit einem Fehler fehl:
Wert m1 () kann nicht aufgelöst werden
Ich habe mein Problem vereinfacht, um klar zu machen, wo das Problem liegt.
Der folgende Code schlägt fehl:
public class Test {
void test() {
// Getting error here
setValue(C1::m1, Integer.ONE);
}
<E extends I1, T> void setValue(BiConsumer<E, T> cons, T value) {
}
}
interface I1 {
}
class C1 implements I1 {
void m1(Integer value) {
}
void m1(int value) {
}
}
Kann jemand bitte, warum sich das so verhält?
Bitte beachten Sie, dass dies nicht mit der Frage der Java 8-Methodenreferenz mit generischen Typen zusammenhängt
Antworten:
Es scheint , dass die Typinferenz Regeln sind nicht „smart“ genug , um den Konflikt zwischen Kommissionierung das Recht zu lösen
m1
Variante und zum Erzeugen der richtigen abgeleiteten Typ Parameter an densetValue
Aufruf (B
undBigDecimal
jeweils).Ich kann nicht genau erklären, warum dies fehlschlägt, aber die Typinferenz war traditionell ein Bereich mit arkanen, gut begründeten und nicht intuitiven Regeln, daher bin ich nicht sehr überrascht.
Sie können dieses Problem umgehen, indem Sie einen Typzeugen hinzufügen (der angibt, mit welchen Typparametern Sie aufrufen möchten
setValue
). An diesem Punkt wählt der Compiler die richtigem1
Methode aus:quelle