2017-10-19 11 views
0

와 나는 안드로이드의 일부 JUnit 테스트를 쓰고 있어요, 나는이 작업을 수행 할 경우 :모호한 메소드 호출은 정수

public void testSetId(){ 
    Friend friend = new Friend(5); 
    assertEquals(5,friend.getId()); 
} 

나는 모호한 메소드 호출 오류가 발생합니다.

모호한 방법 전화 : 두 AssertEquals (INT, INT)와 AssertEquals (Object, Object)를 사용하여 일치

그러나 나는이 작업을 수행 할 경우

그것은 작동
public void testSetId(){ 
    Integer ID = 5; 
    Friend friend = new Friend(ID); 
    assertEquals(ID, friend.getId()); 
} 

. 두 번째 함수가 똑같은 일을해야한다고 생각합니다.

여기에 무슨 일이 일어나고 있습니까?

+1

'id' '친구'의 'int'또는 'Integer'가 될 수 있습니까? – GriffeyDog

+0

ID가 정수인 경우 – user2782067

+0

getId()의 반환 유형이 정수가 아닌 정수인지 확인할 수 있습니까? –

답변

2

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 오버로드가 선택됩니다.

첫 번째 예에서는 intInteger을 전달하려고합니다. int, int 메서드는 두 번째 인수를 자동 언 박싱하는 경우에만 적용되고 Object, Object 메서드는 첫 번째 인수를 자동 저장하여 적용됩니다. 따라서 오버로드는 첫 번째 패스에서 선택할 수 없으며 두 방법 모두 다른 것보다 더 구체적이지 않으므로 (마지막 비트를 살펴야 함) 컴파일러는 두 가지 방법 중 하나를 선택할 수 없습니다.

과부하 해결은 매우 복잡하며, 사실은 꽤 간단합니다 (var-args와 관련된 규칙도 있습니다). 그러나 실제로 모든 규칙을 배울 필요는 없습니다. 컴파일러에게 적용 할 메소드를 명시해야하는 경우 명시 적 캐스트 또는 캐스트를 항상 포함 할 수 있습니다.

assertEquals((Integer) id, friend.getId());