Java-8의 메소드 참조 및 제네릭


11

메소드 참조 에 문제가 있습니다.일반 유형과 결합 된 있습니다.

오버로드 된 메소드를 호출해야하는 코드가 있지만 오류로 실패합니다.

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와 관련이 없습니다.


내가 방법 중 하나를 제거하면 그것은 잘 작동합니다
Joker

이 질문을 다시 열어 주셔서 감사합니다 ... :)
Joker

답변:


7

형식 유추 규칙은 올바른 m1변형을 선택하고 setValue호출에 대한 올바른 유추 된 형식 매개 변수를 생성하는 것 ( BBigDecimal각각) 간의 충돌을 해결하기에 "스마트"하지 않은 것 같습니다 .

이것이 실패 하는지 설명 할 수는 없지만 유형 유추는 전통적으로 비전이 있고 합리적이고 직관적이지 않은 규칙이있는 영역이므로 크게 놀랍지 않습니다.

setValue컴파일러가 올바른 m1메소드를 선택할 시점에 유형 감시 (추가 할 유형 매개 변수 지정)를 추가하여이 문제를 해결할 수 있습니다 .

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.