>Java >java지도 시간 >메소드 오버로드에 Null을 전달하면 객체 버전 대신 문자열 버전이 선택되는 이유는 무엇입니까?

메소드 오버로드에 Null을 전달하면 객체 버전 대신 문자열 버전이 선택되는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 15:54:02606검색

Why Does Passing Null to a Method Overload Choose the String Version Over the Object Version?

오버로드 해결: Null 리터럴 해석

Java에서 Null 리터럴은 모든 개체 변수에 할당할 수 있는 유효한 참조입니다. , String과 같은 참조 유형을 포함합니다. 이 동작은 매개변수가 null로 전달될 때 오버로드된 메서드를 해결하는 데 중요한 역할을 합니다.

다음 코드 조각을 고려하세요.

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

이 예에서 메서드 메서드가 호출될 때 null 리터럴인 경우 Java 컴파일러는 메서드(Object o) 오버로드 대신 메서드(String s) 오버로드를 선택합니다. 이 동작은 가장 구체적인 오버로드 해결의 원칙으로 설명됩니다.

JLS(Java 언어 사양)에 따라 컴파일러는 "가장 구체적인" 오버로드를 선택합니다. 컴파일 타임 유형 오류 없이 호출이 전달될 수 있습니다." 여기서 null 리터럴은 메소드(String s) 오버로드에는 오류 없이 전달될 수 있지만 메소드(Object o) 오버로드에는 전달되지 않습니다.

따라서 Java 컴파일러는 메소드(String s) 오버로드를 선택합니다. , 프로그램의 출력은 "String Version"입니다.

그러나

...
   public void method(StringBuffer sb) {
      System.out.println("StringBuffer Verion");
   }
...

StringBuffer 매개 변수를 허용하기 위해 세 번째 오버로드가 추가되면 코드가 컴파일되지 않습니다. 이는 이제 메서드(String s) 및 메서드(StringBuffer sb) 오버로드가 모두 동일하게 구체적이어서 모호성이 발생하고 컴파일러가 가장 적절한 오버로드를 선택하지 못하기 때문입니다.

위 내용은 메소드 오버로드에 Null을 전달하면 객체 버전 대신 문자열 버전이 선택되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.