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
调用(B
和BigDecimal
)生成正确推断类型参数之间的冲突分别)。
我无法完全解释 为什么这会失败,但类型推断历来是一个有着神秘、合理且不直观规则的领域,所以我并不感到惊讶。 p>
您可以通过添加类型见证(指定您要调用 setValue
的类型参数)来解决此问题,此时编译器将选择正确的 m1
方法:
this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);
【讨论】:
看来我不是内联docs.oracle.com/javase/specs/jls/se8/html/…以上是关于Java-8 中的方法引用和泛型的主要内容,如果未能解决你的问题,请参考以下文章