Чем объясняется этот код Java? - PullRequest
16 голосов
/ 13 июня 2010

У меня есть следующий код:

public class Main {
     public void method(Object o)
     {
           System.out.println("Object Version");
     }
     public void method(String s)
     {
          System.out.println("String Version");
     }
     public static void main(String args[])
     {
           Main question = new Main();
           question.method(null);//1
     }
}

почему получается «String Version»?и почему возникает ошибка компилятора, если первый метод принимает объект StringBuffer?Другой случай: если первый метод принимает объект StringBuffer и я пишу question.method("word");, результатом будет «String Version».Зачем ?почему нет ошибки компилятора?

Ответы [ 2 ]

23 голосов
/ 13 июня 2010

В спецификации JAVA сказано, что в подобных случаях будет вызываться самая специфическая функция.Поскольку String является подтипом Object, будет вызван второй метод.Если вы измените Object на StringBuffer - особого метода не будет, поскольку StringBuffer не является подтипом String и наоборот.В этом случае компилятор не знает, какой метод вызывать, поэтому возникает ошибка.

1 голос
/ 14 июня 2010

При взгляде на другой случай:

пакет com.snamellit;

public class Main {
    public void method(Object o) {
        System.out.println("Object Version");
    }

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

    public static void main(String args[]) {
        Main question = new Main();
        question.method("word");
    }
}

Если первый метод tqkes представляет собой StringBuffer, а второй - String, путаница невозможна, так как слово представляет собой String, а не StringBuffer.

В Java идентичность функции / метода зависит от 3-х вещей: имени, типа параметров (он же сигнатура аргумента) и загрузчика классов. Поскольку оба типа имеют различную сигнатуру аргумента, компилятор может легко выбрать правильный и не вызывает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...