Riferimento al metodo e generici in Java-8


11

Sto affrontando il problema con il riferimento al metodo combinato con tipi generici.

Abbiamo codice in cui è necessario chiamare un metodo sovraccarico, ma non riesce con errore:

Impossibile risolvere il valore m1 ()

Ho semplificato il mio problema per chiarire dove si trova il problema.

Il seguente codice ha esito negativo:

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) {
    }
}

Qualcuno può per favore perché questo si sta comportando in questo modo?

Si prega di notare che questo non è correlato alla domanda Metodo di riferimento Java 8 con tipi generici


no se rimuovo uno dei metodi che sta funzionando bene allora
Joker il

Grazie per aver riaperto questa domanda di nuovo ... :)
Joker il

Risposte:


7

Sembra che le regole di inferenza del tipo non siano abbastanza "intelligenti" per risolvere il conflitto tra la scelta della m1variante giusta e la generazione dei parametri di tipo dedotto corretti alla setValuechiamata ( Be BigDecimalrispettivamente).

Non riesco proprio a spiegare perché questo fallisca, ma l'inferenza del tipo è stata tradizionalmente un'area con regole arcane, ben ragionate e non intuitive, quindi non sono molto sorpreso.

Puoi aggirare questo problema aggiungendo un tipo di controllo (specificando quali parametri di tipo vuoi chiamare setValue) a quel punto il compilatore sceglierà il m1metodo corretto :

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);

Sembra che non sia in linea con docs.oracle.com/javase/specs/jls/se8/html/…
Joker il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.