Довідник методу та дженерики в Java-8


11

Я стикаюся з проблемою з посиланням на метод у поєднанні з загальними типами.

У нас є код, куди нам потрібно викликати перевантажений метод, але він не вдається з помилкою:

Неможливо вирішити значення m1 ()

Я спростив свою проблему, щоб зрозуміти, в чому проблема.

Наступний код не вдається:

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

Може хтось порадує, чому це так поводиться?

Будь ласка, зауважте, це не пов'язане з питанням посилання методу Java 8 із загальними типами


ні, якщо я
Джокер

Дякую за те, що ви знову
Джокер

Відповіді:


7

Здається, що правила виводу типу недостатньо "розумні", щоб вирішити конфлікт між вибором правильного m1варіанту та генерацією правильних параметрів типу виводу для setValueвиклику ( Bі BigDecimalвідповідно).

Я не можу повністю пояснити, чому це не вдається, але висновок типу традиційно був областю з прихованими, обґрунтованими та неінтуїтивними правилами, тому я не дуже здивований.

Ви можете подолати цю проблему, додавши свідчення типу (вказуючи, з якими параметрами типу ви хочете зателефонувати setValue), після чого компілятор вибере правильний m1метод:

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

Здається, я не впорядкований
Джокер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.