我遇到method reference
与Generic
类型结合使用的问题。
我们有需要调用重载方法的代码,但是由于错误而失败:
无法解析值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不相关
[似乎类型推断规则不够“智能”,无法解决在选择正确的m1
变体与为setValue
调用生成正确的推断类型参数(分别为B
和BigDecimal
)。
我无法完全解释为什么会失败,但是传统上类型推论一直是一个有着奥秘,合理且不直观的规则的区域,所以我并不感到惊讶。
您可以通过添加类型见证程序(指定要用来调用setValue
的类型参数来解决此问题,编译器将在此时选择正确的m1
方法:
this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);