Я удивился, почему они тоже не поддерживают это. Конечно, если вы проигнорируете возвращаемое значение, компилятор не сможет узнать, что вы хотите. Но это та же неясность, которая возникает при прохождении нулей. Как:
String doSomething(String s) { ... }
String doSomething(Integer s) { ... }
...
String out=doSomething(null);
В этом случае компилятор просто жалуется, что вызов неоднозначный, и вы должны разрешить его, передав нулевое значение, например:
String out=doSomething((String)null);
Вы можете сделать то же самое с перегрузкой по типу возврата:
String getSomething() { ... }
Integer getSomething() { ... }
...
Integer n=getSomething();
предположительно вызовет вторую функцию.
getSomething();
будет неоднозначным (и в этом примере, вероятно, бесполезным, если у него нет побочных эффектов, но это уже другая история), так что вам придется сказать:
(String) getSomething();
Более реалистично, возможно:
if ((String) getSomething()==null) ...
Но это простой случай. Я вижу, что компилятор не хочет поддерживать это, потому что это может быть очень сложно понять, кроме простого назначения. Например, рассмотрим:
String getSomething() { ... };
Integer getSomething() { ... };
String getOtherthing() { ... };
...
if (getSomething().equals(getOtherthing())) ...
Компилятор должен выяснить, что и String, и Integer имеют функции равенства, поэтому любой из них допустим в этой точке. Тогда следует заметить, что getOtherthing является строкой, а Integer.equals (String) маловероятен, поэтому, вероятно, автор хотел получить String.equals (String). Выполнимо, но в этот момент я начинаю понимать, что в общем случае это может быть зверь.
А затем предположим, что мы добавляем:
Integer getOtherthing() { ... };
Что теперь делает компилятор с этим оператором IF? Он может использовать строковые версии обеих функций или Integer, но не String одной и Integer другой. В этот момент он должен был настаивать на актерском составе, чтобы сказать, что, я думаю. Но сложность действительно выходит из-под контроля.
И если компилятору сложно понять, что вы на самом деле имеете в виду, представьте, как бы это выглядел для другого программиста, который не может просмотреть все сигнатуры функций так быстро, как это может сделать компилятор.