Mam problem z odniesieniem do metody w połączeniu z typami rodzajowymi.
Mamy kod, w którym musimy wywołać przeciążoną metodę, ale błąd kończy się niepowodzeniem:
Nie można rozwiązać wartości m1 ()
Uprościłem swój problem, aby wyjaśnić, gdzie leży problem.
Następujący kod kończy się niepowodzeniem:
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) {
}
}
Czy ktoś może zadać sobie pytanie, dlaczego tak się zachowuje?
Uwaga: nie ma to związku z pytaniem Odniesienie do metody Java 8 z typami rodzajowymi
Odpowiedzi:
Wydaje się, że reguły wnioskowania typu nie są wystarczająco „inteligentne”, aby rozwiązać konflikt między wybraniem odpowiedniego
m1
wariantu a wygenerowaniem prawidłowych wywnioskowanych parametrów typu dlasetValue
wywołania (B
iBigDecimal
odpowiednio).Nie potrafię do końca wyjaśnić, dlaczego to się nie udaje, ale wnioskowanie o typie tradycyjnie było obszarem o tajemnych, dobrze uzasadnionych i nie intuicyjnych regułach, więc nie jestem bardzo zaskoczony.
Możesz obejść ten problem, dodając monitor typu (określając parametry typu, które chcesz wywołać
setValue
), w którym momencie kompilator wybierze poprawnąm1
metodę:źródło