Java의 메소드 오버로딩 및 널 오류
Java에서는 메소드를 오버로드하는 것이 매우 일반적입니다. 다음은 흥미로운 Java 프로그램입니다.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); // This line causes error mv . fun ( null ); } }
출력 :
22: error: reference to fun is ambiguous mv.fun(null); ^ both method fun(Integer) in Test and method fun(String) in Test match 1 error
위 시나리오에서 컴파일 시간 오류가 발생하는 이유는 Integer 및 String 메소드 인수가 모두 Java의 기본 데이터 유형이 아니기 때문입니다. 이는 null 값을 허용한다는 의미입니다. method1에 null 값을 전달하면 컴파일러는 둘 다 null을 허용하므로 어떤 메서드를 선택해야 하는지 혼란스러워집니다. 의도적으로 null 값을 전달하지 않는 한 이 컴파일 시간 오류는 발생하지 않습니다. 예를 들어 코딩하는 동안 일반적으로 따르는 아래 시나리오를 참조하십시오.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); Integer arg = null ; // No compiler error mv . fun ( arg ); } }
출력 :
fun(Integer )
위 시나리오에서 표현식 결과로 인해 'arg' 값이 null인 경우 null 값이 method1에 전달됩니다. 여기서는 인수가 Integer 유형임을 지정하므로 컴파일러가 method1(Integer i)을 선택하고 그 안의 코드를 실행하므로 컴파일 시간 오류가 발생하지 않습니다. 참고: 재정의된 메서드 인수가 기본 데이터 유형인 경우 이 문제가 지속되지 않습니다. 왜냐하면 컴파일러는 가장 적합한 방법을 선택하고 실행하기 때문입니다.