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

Posted

技术标签:

【中文标题】Java-8 中的方法引用和泛型【英文标题】:Method reference and Generics in Java-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无关

【问题讨论】:

不,如果我删除其中一种方法它工作正常,那么 感谢您再次提出这个问题... :) 【参考方案1】:

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

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

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

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

【讨论】:

看来我不是内联docs.oracle.com/javase/specs/jls/se8/html/…

以上是关于Java-8 中的方法引用和泛型的主要内容,如果未能解决你的问题,请参考以下文章

值类型引用类型和泛型的前世今生

C#泛型

java三个引用类型

C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参推断和引用

C#002 方法和接口

C#002 方法和接口