문제는 String.valueOf
메소드가 오버로드 된다는 것입니다 .
Java Specification Language는 이러한 종류의 경우 가장 구체적인 과부하 가 선택되도록 요구합니다.
둘 이상의 멤버 메소드가 액세스 가능하고 메소드 호출에 적용 가능한 경우, 런타임 메소드 디스패치에 대한 설명자를 제공 할 멤버를 선택해야합니다. Java 프로그래밍 언어는 가장 구체적인 방법을 선택 한다는 규칙을 사용합니다 .
A는 char[]
-입니다 Object
,하지만 모든 Object
입니다-A char[]
. 따라서, char[]
인 더 구체적인 것보다 Object
, 그리고 자바 언어에 의해 지정된대로 String.valueOf(char[])
과부하이 경우 선택됩니다.
String.valueOf(char[])
는 배열이 아닌 것으로 예상하고 null
, null
이 경우 주어진 이후에을 던진다 NullPointerException
.
쉬운 "수정"은 다음과 같이 null
명시 적으로 캐스팅하는 Object
것입니다.
System.out.println(String.valueOf((Object) null));
// prints "null"
관련 질문
이야기의 교훈
몇 가지 중요한 것들이 있습니다.
- 효과적인 Java 2 판, 항목 41 : 신중하게 과부하 사용
- 과부하가 걸린다고해서 항상 매번해야하는 것은 아닙니다
- 혼란을 일으킬 수 있습니다 (특히 방법이 크게 다른 경우)
- 좋은 IDE를 사용하면 컴파일 타임에 어떤 과부하가 선택되었는지 확인할 수 있습니다
- 이클립스를 사용하면 위의 발현에 마우스 호버를 할 수 있고 볼 참 의
valueOf(char[])
과부하를 선택!
- 때로는 명시 적으로 캐스팅하고 싶을 때가 있습니다
null
(예제)
또한보십시오
캐스팅시 null
null
특정 참조 유형 으로 명시 적으로 캐스트해야하는 두 가지 상황 이 있습니다.
- 과부하를 선택하려면 (위의 예에서와 같이)
null
vararg 매개 변수에 단일 인수로 제공하려면
후자의 간단한 예는 다음과 같습니다.
static void vararg(Object... os) {
System.out.println(os.length);
}
그러면 다음을 가질 수 있습니다.
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
또한보십시오
관련 질문
null
이 경우 와 같이) 에서 하나의 인수를 호출 할 수 있으면 두 과부하 가 해당 값과 동일하게 작동하는지 확인하십시오!