source

null 인수에 대한 메서드 오버로드

manycodes 2023. 1. 29. 20:18
반응형

null 인수에 대한 메서드 오버로드

매개 변수를 사용하여 다음 세 가지 방법을 추가했습니다.

public static  void doSomething(Object obj) {
    System.out.println("Object called");
}

public static  void doSomething(char[] obj) {
    System.out.println("Array called");
}

public static  void doSomething(Integer obj) {
    System.out.println("Integer called");
}

가 할 때doSomething(null)그 후 컴파일러는 애매한 메서드로 오류를 발생시킵니다.그래서 문제가 되는 건Integer ★★★★★★★★★★★★★★★★★」char[] 또는 「」를 참조해 주세요.Integer ★★★★★★★★★★★★★★★★★」Object방??

Java는 항상 사용 가능한 메서드의 가장 구체적인 버전을 사용하려고 합니다(JLS © 15.12.2 참조).

Object,char[] ★★★★★★★★★★★★★★★★★」Integer 탈 수 null유효값으로 합니다.따라서 3가지 버전이 모두 적용 가능하기 때문에 Java는 가장 구체적인 버전을 찾아야 합니다.

★★Object은 슈퍼타입은 슈퍼타입입니다.char[]은 , , , , , , , , 보다 입니다.Object 방법만 , 이 두 가지 방법이 있습니다.char[]버전이 선택됩니다.

다 할 때char[] ★★★★★★★★★★★★★★★★★」Integer사용 가능한 버전이 있습니다.그러면 두 버전 모두 보다 구체적입니다.Object그러나 어느 것도 다른 것보다 구체적이지 않기 때문에 Java는 어떤 것을 호출해야 할지 결정할 수 없습니다.이 경우, 적절한 타입의 인수를 사용하여, 어느 쪽을 호출하고 싶은지를 명시적으로 언급할 필요가 있습니다.

실제로 이 문제는 생각보다 거의 발생하지 않습니다.이 하기 때문입니다.null하지 않은 예: as소소소소소소소소소소소 ( ( ( or or or or예예 or:Object를 참조해 주세요.

반대로, 다음과 같은 호출은 완전히 모호하지 않습니다.

char[] x = null;
doSomething(x);

nullJava는 변수의 유형을 고려하기 때문에 어떤 메서드를 호출해야 하는지 정확하게 알고 있습니다.

세각은, 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3」 「3 「3」 「3」 「3」 「3 「3」 「3」 「3」 「3」 「3」 「3」 「3 「3」 「3」 「3」 「null.이기 때문입니다.각 매개 변수 유형은 참조 유형이기 때문입니다.

다음은 특정 메서드를 null로 호출하는 세 가지 방법입니다.

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

를 실제로 「」로 이라면, 이 요?nullinvites들 . 이런 앞으로 있습니다.이러한 설계는 미래에 오류를 야기합니다.

null는 세 가지 유형 중 하나에 대해 유효한 값입니다.따라서 컴파일러는 어떤 함수를 사용할지 결정할 수 없습니다. 을 사용하다doSomething((Object)null) ★★★★★★★★★★★★★★★★★」doSomething((Integer)null)★★★★★★ 。

Java의 모든 클래스는 Object 클래스를 확장합니다.Integer 클래스도 Object를 확장합니다.따라서 Object와 Integer는 모두 Object 인스턴스로 간주됩니다.따라서 null을 파라미터로 전달하면 컴파일러는 어떤 오브젝트 메서드를 호출해야 하는지 헷갈립니다.파라미터 Object 또는 파라미터 Integer는 둘 다 객체이고 참조가 null일 수 있기 때문에 사용합니다.그러나 Java의 프리미티브는 오브젝트를 확장하지 않습니다.

I Have try this and 정확히 한 쌍의 오버로드된 메서드가 있고 그 중 하나가 파라미터 타입 Object일 경우 컴파일러는 항상 보다 구체적인 타입의 메서드를 선택합니다.그러나 특정 유형이 여러 개일 경우 컴파일러는 애매한 메서드 오류를 발생시킵니다.

이것은 컴파일 시간 이벤트이기 때문에 이 메서드에 의도적으로 늘을 전달했을 경우에만 발생합니다.이 방법을 의도적으로 사용하는 경우 파라미터 없이 이 방법을 다시 오버로드하거나 다른 방법을 모두 작성하는 것이 좋습니다.

doSomething(char[] obj)과 doSomething(Integer obj)으로 인해 애매한 부분이 있습니다.

char [ ]및 정수 모두 null의 상위값이 같기 때문에 애매모호합니다.

class Sample{
  public static void main (String[] args) {
       Sample s = new Sample();
       s.printVal(null);

    } 
    public static void printVal(Object i){
        System.out.println("obj called "+i);
    }

    public static void printVal(Integer i){
        System.out.println("Int called "+i);
    }
}

출력은 Int가 null이므로 모호성은 char[]와 Integer로 지정됩니다.

언급URL : https://stackoverflow.com/questions/5229809/method-overloading-for-null-argument

반응형