메소드 참조 에 문제가 있습니다.일반 유형과 결합 된 있습니다.
오버로드 된 메소드를 호출해야하는 코드가 있지만 오류로 실패합니다.
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와 관련이 없습니다.
답변
형식 유추 규칙은 올바른 m1
변형을 선택하고 setValue
호출에 대한 올바른 유추 된 형식 매개 변수를 생성하는 것 ( B
및 BigDecimal
각각) 간의 충돌을 해결하기에 “스마트”하지 않은 것 같습니다 .
왜 이것이 실패 하는지 설명 할 수는 없지만 유형 유추는 전통적으로 비전이 있고 합리적이고 직관적이지 않은 규칙이있는 영역이므로 크게 놀랍지 않습니다.
setValue
컴파일러가 올바른 m1
메소드를 선택할 시점에 유형 감시 (추가 할 유형 매개 변수 지정)를 추가하여이 문제를 해결할 수 있습니다 .
this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);