【问题标题】:Method reference and Generics in Java-8Java-8 中的方法引用和泛型
【发布时间】:2020-04-06 16:51:34
【问题描述】:

我遇到了方法引用与泛型类型结合的问题。

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

无法解析值 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】:

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
相关资源
最近更新 更多