Java-8 中的方法引用和泛型

Jok*_*ker 10 java generics lambda java-8

我面临着方法引用与泛型类型相结合的问题。

我们有代码需要调用重载方法,但它失败并出现错误:

无法解析值 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以请为什么这是这样的行为?

请注意,这与Java 8 Method reference with generic types问题无关

Joa*_*uer 6

类型推断规则似乎不够“智能”,无法解决选择正确m1变体和生成正确推断类型参数之间的冲突setValue(分别为BBigDecimal)。

我无法完全解释为什么会失败,但传统上类型推断是一个有着神秘、合理和不直观规则的领域,所以我并不感到惊讶。

您可以通过添加类型见证(指定要调用的类型参数setValue)来解决此问题,此时编译器将选择正确的m1方法:

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);
Run Code Online (Sandbox Code Playgroud)