2015-12-30 3 views
4

Я знаю, что метод может быть переопределен тем, который возвращает подкласс.Можно ли перегрузить метод другим, который возвращает подкласс?

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

public Object foo() {...} 
public String foo(int a) {...} 

ли выше код действителен? (Если в пределах одного класса)

о чем?

public Object foo() {...} 
public String foo() {...} 
+3

Почему бы не попробовать и не выяснить? – Todd

+2

Нет, Java не допускает полиморфизм по типу возврата. Ваш пример работает из-за разных списков параметров. – duffymo

+0

Вы всегда можете вернуть ковариантный тип в переопределение. Однако вы не можете обеспечить перегрузку, которая переопределяет эквивалент другому определению в том же классе. –

ответ

2

Этот пример:

public Object foo() {...} 
public String foo(int a) {...} 

до тех пор, как два метода получить другой набор переменных, нет никаких проблем с возвратом различных типов (даже если они не являются подклассом).

Логика очень проста - если компилятор может выбрать без сомнения, какой из них использовать - проблем нет. В этом прецедентном если вы даете метод Int это один метод, и без параметров, это другое, не Дилема (и то же имя здесь не имеет значения)

за:

public Object foo() {...} 
public String foo() {...} 

Это один недействительно, так как здесь компилятор не может выбрать, какой из них использовать.

+0

Существует больше сказать, чем просто это. public Super foo (Super x) может сосуществовать с общедоступным Sub foo (Sub x), когда Sub расширяет Super. Конечно, это, строго говоря, не случай перегрузки, а [должно быть] одна из специализированных реализаций. –

2

Да, и это даже не нужно быть подклассом foo() и foo(int) два совершенно разных и не связанных между собой функций, насколько компилятор обеспокоен, каждый из которых может иметь любой тип возврата вы хотите.

1

Да, вы перепутали foo с foo (int a) и дали ему новый тип данных String, компилятор видит это как действительный код, а другой Object foo() и String foo() полностью недействителен в Java

+0

«Перегружен», а не «перегружен». –

3

Начиная с Java 5, ковариантные возвращаемые типы разрешены для переопределены методы. Это означает, что переопределенному методу в подклассе разрешено использовать подпись, которая возвращает тип, который может быть подклассом возвращаемого типа родительской подписи.

Чтобы сделать этот бетон, у вас есть этот интерфейс:

public interface MyInterface { 
    Number apply(double op1, double op2); 
     : 
     : 
} 

Следующая является законным, поскольку возвращаемый тип является подклассом номер:

public class MyClass implements MyInterface { 
    : 
    : 
    @Override 
    public Integer apply(double op1, double op2) { 
     : 
     : 
     return Integer.valueOf(result); 
    } 
} 

Потому что перегруженные методы (которые имеют одно и то же имя, но разные подписи) - это фактически разные методы, вы можете использовать разные типы возвращаемых данных, если хотите ... однако ... это обескураживает, потому что методы с таким же именем, типы могут вводить в заблуждение программистов и могут усложнять использование вашего API. Лучше не перегружать mrthods, когда вы можете разумно избежать этого.

Смежные вопросы