문제

오버로드된 함수 compute1(), compute2(), 그리고 compute5() 아래에서 사용하려고 하면 컴파일 오류가 발생합니다.

package com.example.test.reflect;

class JLS15Test2
{
    int compute1(Object o1, Integer i, Integer j)         { return 1; }
    int compute1(String s1, Integer i, int j)             { return 2; }

    int compute2(Object o1, Integer i, int j)             { return 3; }
    int compute2(String s1, Integer i, Integer j)         { return 4; }

    int compute3(Object o1, Integer i, int j)             { return 5; }
    int compute3(String s1, Integer i, int j)             { return 6; }

    int compute4(Object o1, Integer i, Integer j)         { return 7; }
    int compute4(String s1, Integer i, Integer j)         { return 8; }

    int compute5(Object o1, Integer i, Object j)          { return 9; }
    int compute5(String s1, Integer i, int j)             { return 10; }


    public static void main(String[] args) 
    {
        JLS15Test2 y = new JLS15Test2();

        // won't compile:
        // The method compute1(Object, Integer, Integer) is ambiguous 
        // for the type JLS15Test2
        // System.out.println(y.compute1("hi", 1, 1));

        // Neither will this (same reason)
        // System.out.println(y.compute2("hi", 1, 1));
        System.out.println(y.compute3("hi", 1, 1));
        System.out.println(y.compute4("hi", 1, 1));

        // neither will this (same reason)
        // System.out.println(y.compute5("hi", 1, 1));
    }
}

JLS 섹션 15.12를 읽은 후 이해가 된 것 같습니다.오버로드된 메서드 일치의 2단계(boxing/unboxing 허용, 가변 인수 없음)에서 "가장 구체적인 메서드"를 결정할 때 JLS는 (사실상) 가장 구체적인 메서드는 형식 매개변수가 다른 적용 가능한 메서드의 하위 유형인 메서드라고 말합니다. , 기본 요소 및 객체(예: int 그리고 Integer)은 결코 서로의 하위 유형이 아닙니다.그래서 Integer 의 하위 유형입니다. Integer, 그리고 int 의 하위 유형입니다. int, 하지만 Integer 그리고 int 하위 유형 비교와 호환되지 않으므로 둘 다 compute1()/compute2() 쌍에는 가장 구체적인 방법이 있습니다.

(반면에 compute3() 그리고 compute4() 와 함께하는 방법 String 인수는 다음을 사용하는 메서드보다 더 구체적입니다. Object 인수이므로 프로그램은 6과 8을 인쇄합니다.)

내 추론이 맞나요?

도움이 되었습니까?

해결책

네, 당신의 추론이 맞습니다.

다른 팁

기본 int와 boxed Integer만 취하는 다른 메소드를 추가하면 어느 메소드가 호출하기에 적합한지 결정할 수 있습니다.

int compute6(int i) { return 11;}
int compute6(Integer i){return 12;}
...
System.out.println(y.compute6(1));

이를 바탕으로, 이는 단순히 개별 유형 관계뿐만 아니라 다양한 매개변수 간의 상호작용과 관련이 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top