Java 5 이전에는 자동 차단 또는 자동 언 박싱이 없었습니다. 이 유형 Integer
의 매개 변수를했다 foo
하는 방법은 다음과 유사하게
foo(5); // 5 needs to be autoboxed
를 컴파일하지 않은 경우, 유형 int
의 매개 변수를했다 bar
하는 방법은,이 컴파일되지 않은 경우 의미
bar(new Integer(5)); // The Integer needs to be unboxed
autoboxing과 auto-unboxing이 도입되었을 때 기존 코드가 이전과 똑같은 방식으로 계속 작동하는 것이 필수적이었습니다. 따라서 컴파일러가 호출되는 메서드를 결정할 때 먼저 autoboxing 또는 auto-unboxing이 필요없는 적용 가능한 메서드 만 고려합니다. 그러한 메소드가없는 경우에만 컴파일러는 autoboxing 및/또는 auto-unboxing이 필요한 메소드를 고려합니다. getId
이후
는 Object
, Object
방법은 첫 번째 인수는 또한 Integer
때 경우에 오토 박싱없이 호출 될 수 Integer
반환한다. 그러나 int
, int
메서드는 두 번째 매개 변수의 자동 언 박싱으로 만 호출 할 수 있습니다. 따라서 두 번째 예에서는 첫 번째 패스에서 Object
, Object
오버로드가 선택됩니다.
첫 번째 예에서는 int
과 Integer
을 전달하려고합니다. int
, int
메서드는 두 번째 인수를 자동 언 박싱하는 경우에만 적용되고 Object
, Object
메서드는 첫 번째 인수를 자동 저장하여 적용됩니다. 따라서 오버로드는 첫 번째 패스에서 선택할 수 없으며 두 방법 모두 다른 것보다 더 구체적이지 않으므로 (마지막 비트를 살펴야 함) 컴파일러는 두 가지 방법 중 하나를 선택할 수 없습니다.
과부하 해결은 매우 복잡하며, 사실은 꽤 간단합니다 (var-args와 관련된 규칙도 있습니다). 그러나 실제로 모든 규칙을 배울 필요는 없습니다. 컴파일러에게 적용 할 메소드를 명시해야하는 경우 명시 적 캐스트 또는 캐스트를 항상 포함 할 수 있습니다.
assertEquals((Integer) id, friend.getId());
'id' '친구'의 'int'또는 'Integer'가 될 수 있습니까? – GriffeyDog
ID가 정수인 경우 – user2782067
getId()의 반환 유형이 정수가 아닌 정수인지 확인할 수 있습니까? –