Jok*_*ker 10 java generics lambda java-8
我面临着方法引用与泛型类型相结合的问题。
我们有代码需要调用重载方法,但它失败并出现错误:
无法解析值 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) {
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以请为什么这是这样的行为?
类型推断规则似乎不够“智能”,无法解决选择正确m1变体和生成正确推断类型参数之间的冲突setValue(分别为B和BigDecimal)。
我无法完全解释为什么会失败,但传统上类型推断是一个有着神秘、合理和不直观规则的领域,所以我并不感到惊讶。
您可以通过添加类型见证(指定要调用的类型参数setValue)来解决此问题,此时编译器将选择正确的m1方法:
this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |