[java] 널 인수에 대한 메소드 오버로드

매개 변수와 함께 세 가지 방법을 추가했습니다.

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)컴파일러는 모호한 메소드 로 오류를 발생시킵니다 . 그래서 문제 때문에 Integerchar[]방법이나 IntegerObject방법?



답변

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

Object, char[]그리고 Integer모두 걸릴 수 null유효한 값으로. 따라서 3 가지 버전 모두 적용 가능하므로 Java는 가장 구체적인 버전을 찾아야합니다.

Object의 슈퍼 유형 이므로 char[]배열 버전이 Object-version 보다 더 구체적 입니다. 따라서이 두 가지 방법 만 있으면 char[]버전이 선택됩니다.

두 때 char[]Integer버전을 사용할 수 있습니다, 다음 그들보다 더 구체적입니다 Object하지만 자바 전화를 어느 결정할 수 없음, 다른보다 더 구체적입니다. 이 경우 인수를 적절한 유형으로 캐스팅하여 호출하려는 것을 명시 적으로 언급해야합니다.

실제로이 문제는 생각보다 훨씬 드물게 발생합니다. 그 이유는 null특정 유형이 아닌 변수 (예 :)를 사용 하거나 변수를 사용하여 메서드를 명시 적으로 호출 할 때만 발생하기 때문입니다 Object.

반대로 다음 호출은 완벽하게 모호하지 않습니다.

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

여전히 값을 전달하고 있지만 nullJava는 변수 유형을 고려하므로 호출 할 메소드를 정확하게 알고 있습니다.


답변

이 세 가지 메소드의 각 쌍은 null인수 와 함께 호출 될 때 자체적으로 모호합니다 . 각 매개 변수 유형은 참조 유형이기 때문입니다.

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

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

실제로 이러한 메소드를 null인수 와 함께 호출하려는 경우이 모호성을 제거하는 것이 좋습니다 . 이러한 디자인은 미래에 오류를 불러 일으킨다.


답변

null세 가지 유형 중 하나에 유효한 값입니다. 따라서 컴파일러는 사용할 함수를 결정할 수 없습니다. 같은 것을 사용 doSomething((Object)null)하거나 doSomething((Integer)null)대신.


답변

Java의 모든 클래스는 Object 클래스를 확장하고 Integer 클래스도 Object를 확장합니다. 따라서 Object와 Integer는 모두 Object 인스턴스로 간주됩니다. 따라서 매개 변수로 null을 전달하면 컴파일러보다 호출 할 객체 메소드 즉, Object 또는 Parameter Integer로 호출하는 객체 메소드가 객체이며 해당 참조가 모두 null 일 수 있기 때문에 혼동됩니다. 그러나 Java의 기본 요소는 Object를 확장하지 않습니다.


답변

나는 이것을 시도했고 정확히 한 쌍의 오버로드 된 메소드가 있고 그중 하나에 매개 변수 유형 Object가있는 경우 컴파일러는 항상 더 구체적인 유형의 메소드를 선택합니다. 그러나 둘 이상의 특정 유형이있는 경우 컴파일러는 모호한 메소드 오류를 발생시킵니다.

이것은 컴파일 타임 이벤트이므로 의도적으로이 메소드에 널을 전달할 때만 발생할 수 있습니다. 의도적으로 수행 된 경우 매개 변수없이이 메서드를 다시 오버로드하거나 다른 메서드를 모두 만드는 것이 좋습니다.


답변

doSomething (char [] obj) 및 doSomething (Integer obj)로 인해 모호성이 있습니다.

char []와 Integer는 모두 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입니다.