Odwołanie do metody i informacje ogólne w Javie-8

11

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

Żartowniś
źródło
nie, jeśli usunę jedną z metod, to działa dobrze
Joker
Dziękuję za ponowne otwarcie tego pytania ... :)
Joker

Odpowiedzi:

7

Wydaje się, że reguły wnioskowania typu nie są wystarczająco „inteligentne”, aby rozwiązać konflikt między wybraniem odpowiedniego m1wariantu a wygenerowaniem prawidłowych wywnioskowanych parametrów typu dla setValuewywołania ( Bi BigDecimalodpowiednio).

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ą m1metodę:

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);
Joachim Sauer
źródło
Wygląda na to, że nie zgadzam się
Joker