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

Java-8中的方法引用和泛型,java,generics,lambda,java-8,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<

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

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

无法解析值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) {
    }
}
公共类测试{
无效测试(){
//这里有错误
设置值(C1::m1,整数.1);
}
无效设置值(双消费者成本,T值){
}
}
接口I1{
}
类C1实现I1{
无效m1(整数值){
}
无效m1(int值){
}
}
有人能告诉我为什么会这样吗


请注意,这与问题无关,类型推断规则似乎不够“聪明”,无法解决选择正确的
m1
变量与为
setValue
调用生成正确的推断类型参数之间的冲突(
B
bigdecimic

我不能很好地解释为什么这会失败,但类型推断传统上是一个有着神秘、合理和非直觉规则的领域,所以我并不感到惊讶

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

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

否如果我删除了其中一个方法,它工作正常,然后感谢您再次打开此问题…:)看来我不符合你的要求