Java-8中的方法参考和泛型

问题描述 投票:9回答:1

我遇到method referenceGeneric类型结合使用的问题。

我们有需要调用重载方法的代码,但是由于错误而失败:

无法解析值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 Method reference with generic types不相关

java generics lambda java-8
1个回答
6
投票

[似乎类型推断规则不够“智能”,无法解决在选择正确的m1变体与为setValue调用生成正确的推断类型参数(分别为BBigDecimal )。

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

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

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);
© www.soinside.com 2019 - 2024. All rights reserved.