Почему возвращаемые типы не учитываются в перегрузках методов Java? - PullRequest
1 голос
/ 21 марта 2010

Почему возвращаемый тип метода не учитывается при перегрузке метода? Может кто-нибудь объяснить, как компилятор проверяет перегруженные методы?

Ответы [ 2 ]

9 голосов
/ 21 марта 2010

Почему возвращаемый тип метода не учитывается при перегрузке метода?

Основная причина в том, что если вы учли это, многие вызовы функций становятся неоднозначными, если возвращаемое значение не назначено чему-либо. Например, какой вызов функции здесь вызывается?

public String x() { ... }
public int x() { ... }

// ...

x();  // <-- Which one did you mean? It's impossible to tell if you
      //     allow return types to be part of method overloads.

Есть и другие причины, по которым мы не хотим этого делать. Тем не менее, многие языки do позволяют своим сигнатурам различаться только по типу возврата; Haskell и Perl - два примера. Если ваш язык допускает это, нетрудно понять, что все, что вам нужно для поддержки, это еще один шаг в процессе разрешения методов: просто предоставьте компилятору очевидный способ выбрать тот или иной метод. В приведенном выше примере, возможно, мы бы определили приоритет (например, первый определенный метод - это тот, который выигрывает, например, поэтому наш вызов x() вызовет String x()).

Следует также отметить, что JVM позволяет разрешить существование двух методов, сигнатура которых отличается только типом возвращаемого значения. (Вот как это делают Scala и другие языки JVM, которые поддерживают это.

2 голосов
/ 21 марта 2010

Может кто-нибудь объяснить, как компилятор проверяет перегруженные методы?

Спецификация языка Java, раздел 8.4.9, будет содержать окончательный (но очень технический) ответ: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.9

...