2009-06-04 4 views
10

다음 두 가지 varargs 메서드를 선언하면 :자바에서는 왜 2 개의 varargs 메소드 foo (int ... ints)와 foo (Object ... objects)가 주어진다면 foo() 호출이 애매하지 않은 이유는 무엇입니까?

public void foo(String... strings) { 
    System.out.println("Foo with Strings"); 
} 

public void foo(int... ints) { 
    System.out.println("Foo with ints"); 
} 

다음 코드가있는 :

foo(); 

이것은 모호 때문에 컴파일러 오류입니다. 예상했다.

하지만 foo의 다음 두 가지 버전이있는 경우

public void foo(Object... objects) { 
    System.out.println("Foo with Objects"); 
} 

public void foo(int... ints) { 
    System.out.println("Foo with ints"); 
} 

다음 코드

foo(); 

는 ints 버전의 메서드를 호출합니다. 두 번째 예제가 모호하지 않고 왜 Object 메서드를 통해 int 메서드로 해석되는지 설명 할 수 있습니까? 감사.

+1

foo에 대한 호출을 표시하지 않았으므로이 질문이 없으면 대답하기 어렵습니다. –

+1

Jon, foo()의 호출은 말 그대로 foo()입니다. 즉 인수가 0입니다. 이 질문을 명확하게하기 위해 편집 할 것입니다. – mikej

+0

* just * int ...와 object ...로, 이것은 나를 위해 컴파일됩니다. String ... 및 int ... (Object가 아닌 ...)에서는 그렇지 않습니다. 질문을 확인해 주시겠습니까? –

답변

29

내가 scjp를 준비 할 때 제대로 기억한다면, 첫 번째 경우에는 두 개의 인수가있어 그 사이에 관계가 없으므로 컴파일러는 하나를 선택할 수 없습니다.

두 번째로 boxing enabled (1.5+)에서 int는 Object의 하위 집합 인 Integer 일 수 있으며 충돌이 발생한 경우 컴파일러는 항상 가장 구체적인 정의를 사용합니다. 따라서 Integer (int)가 우선 순위가됩니다.

+6

이것이 맞습니다. JLS에서 ... 15.12.2.5는 가장 구체적인 방법 http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 – justinhj

4

Java는 항상 가능한 가장 가까운 유형을 사용하므로 int를 메소드에 전달할 때 int ... 메소드가 없으면 정수로 자동 저장되고 Object ...를 사용합니다. int ... 메소드인데, 자바가 먼저 그것을 사용할 것이다. 이것은 Java 컴파일러 디자인의 선택입니다.

+0

언어 디자인을 선택 .. . –