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方法参考问题无关


不,如果我删除其中一种方法就可以了,那就可以了
小丑

感谢您再次打开这个问题... :)
Joker

Answers:


7

看来,类型推理规则是不足够“智能”来解决采摘权之间的冲突m1变种,并产生正确的推断类型参数的setValue调用(BBigDecimal分别)。

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.