2012-12-04 7 views
4

두 가지 함수 호출이 있습니다. 하나는 문자열을 param으로 사용하고 다른 하나는 Object를 사용합니다. 나는이 수행 할 때 다음Java 함수 오버로드가 사용자 정의 클래스로 인해 모호합니다.

foo(Object a){...} 
foo(String s){...} 

과 전화 : 잘 작동

foo(null); 

.


나는이 이렇게 그러나 경우 :

foo(CustomClass a){...} 
foo(String s){...} 

다음 전화 :

foo(null); 

이클립스가 모호 하더군요. 따라서 두 가지 질문 :

  1. 왜 첫 번째 경우가 모호하지 않습니까?
  2. 어떻게 수정합니까?

답변

7

왜 첫 번째 경우가 모호하지 않습니까?

StringObject의 하위 유형이고 컴파일러는 가장 구체적인 것을 선택하기 때문입니다. 따라서 String 매개 변수를 사용하는 방법이 선택됩니다.

어떻게 수정합니까?

두 번째 경우에는 두 매개 변수 유형이 동일한 상속 계층 구조에 있지 않으므로 모호성이 발생합니다. 당신은 그것을 피할 수 없습니다. 왜냐하면 nulltypes에 모두 똑같이 할당 될 수 있기 때문입니다. 컴파일러가 선택할 특정 유형은 없습니다.

명시 적으로 null을 필수 유형으로 캐스팅하여 ambiguity error을 피할 수 있습니다.

foo((String)null); 
foo((CustomClass)null); 
+0

컴파일러는 선택할 수 없습니다 만, 호출 널 (null)이 방법을 추론하기 위해 유형 원하는 유형으로 캐스트 할 수 있습니다되어야하는 방법을 알고있는 경우 -이 :

그래서, 아래의 호출은 잘 작동합니다 . – pabrantes

+0

@pabrantes. 왜 캐스팅이 있을까요? 'null'은'String'과'CustomClass' 둘 다에 정확히 일치하지 않습니까? –

+1

당신이 말한 것에 대해 옳았 습니다만 반환 유형이 메서드의 서명에 포함되어 있지 않기 때문에 원하는 반환 유형을 알고있는 경우 foo (String) 및 foo (CustomClass)가 다른 유형을 반환 할 수 있습니다. 명시 적 캐스트를 사용하면 문제가 해결됩니다. 이것은 (비록 대부분의 경우 나쁜 인터페이스 디자인이지만) 대소 문자 구별이지만 그 일은 – pabrantes

관련 문제