2010-03-13 18 views
69

¿Por qué no es posible sobrecargar una función simplemente cambiando el tipo de retorno? ¿Eso cambiará en una versión futura de Java?Sobrecarga con diferente tipo de devolución en Java?

Por cierto, solo como referencia, ¿es esto posible en C++?

+1

posible duplicado de [Función de sobrecarga por tipo de devolución?] (Http: // stackoverflow.com/questions/442026/function-overloading-by-return-type) – KNU

+0

KNU, la otra respuesta difiere en que formula la pregunta en general, términos que no son específicos del idioma. También es interesante que la respuesta aceptada de otra pregunta va más allá al especificar que Java JVM permite que se realice con la manipulación de elementos internos. –

Respuesta

116

No puede hacerlo en Java, y no puede hacerlo en C++. La razón es que el valor devuelto por sí sola no es suficiente para que el compilador de averiguar qué función debe llamar:

public int foo() {...} 
public float foo() {..} 

... 
foo(); // which one? 
+1

Siempre pensé que si hacíamos algo como int i = foo() o float f = foo() sabría cuál, pero si la declaración es solo la función que el compilador no sabría. Lo entiendo. Gracias. – nunos

+5

@nunos, incluso si fuera float f = foo(), el compilador no podría resolverlo porque una int sería una entrada válida para un float. Comparar float f = 7; (¿7 es un flotante o int?) – NomeN

+5

@NomeN Pero su afirmación sugiere que func (int i) y func (float i) serían indistinguibles para el compilador, y todos sabemos que esto no es cierto. La verdadera razón viene dada por Oded (ver la respuesta siguiente): se trata de la firma del método. Y, por cierto. 7 es definitivamente entero mientras que 7.0 o 7f es flotante ;-) –

40

La razón es que las sobrecargas en Java sólo se permiten para los métodos con diferentes firmas .

El tipo de devolución no forma parte de la firma del método, por lo que no se puede utilizar para distinguir sobrecargas.

Consulte Defining Methods de los tutoriales de Java.

+3

¿Pero por qué el tipo de devolución no forma parte de la ** firma ** – andho

+1

@andho - Porque así es como se han definido las firmas? – Oded

+32

oh "solo porque"! Ya veo. – andho

19

Antes de Java 5.0, cuando anula un método, tanto los parámetros como el tipo de devolución deben coincidir exactamente. En Java 5.0, introduce una nueva instalación llamada tipo de retorno covariante. Puede anular un método con la misma firma pero devuelve una subclase del objeto devuelto. En otras palabras, un método en una subclase puede devolver un objeto cuyo tipo es una subclase del tipo devuelto por el método con la misma firma en la superclase.

+2

Estaba desconcertado cuando vi esto por primera vez. ¡Gracias por explicar por qué esto es posible! –

+11

pero esto no tiene nada que ver con la sobrecarga aunque ... –

+2

sobrecarga y anulación son diferentes. La sobrecarga no implica necesariamente (necesariamente) la herencia – zencv

1

El compilador no tiene en cuenta el tipo de devolución al diferenciar los métodos, por lo que no puede declarar dos métodos con la misma firma, incluso si tienen un tipo de devolución diferente.

1

El tipo de devolución no importa al sobrecargar un método. ¡Solo necesitamos asegurarnos de que no haya ambigüedad!

La única forma en que Java puede saber qué método llamar es mediante la diferenciación de los tipos de la lista de argumentos. Si el compilador permitiera dos métodos con el mismo nombre y los mismos tipos de argumentos, no habría forma de determinar a cuál debería llamar.

5

Overloaded Los métodos en Java pueden tener diferentes tipos de devolución dado que las listas de argumentos también son diferentes.

-1

no, no realmente posible de esa manera sólo se puede sobrecarga de ninguna de argumentos o tipo de datos de los argumentos

0

El compilador no considera el tipo de retorno al diferenciar métodos, por lo que no se puede declarar dos métodos con la misma firma, incluso si tienen un tipo de devolución diferente.

Si conoce la ejecución de funciones, sabrá que cuando llamamos a una función la parte de definición se ejecuta y al final necesitamos la declaración return, por lo tanto podemos decir que return viene después de la definición completa de la función, por eso hay dos o más funciones con el mismo nombre y con el mismo tipo y no. de argumentos al momento de llamar a cómo el compilador sabrá a cuál llamar, porque el nombre y los parámetros de la función son los mismos. En el momento de realizar la llamada, en primer lugar, todo el enfoque se centrará en los argumentos y el nombre de la función y, una vez completada la definición de la función, trataremos por fin la declaración de devolución.

Error de tiempo de compilación es mejor que Error de tiempo de ejecución. Por lo tanto, el compilador de Java representa el error de tiempo del compilador si declara que el mismo método tiene los mismos parámetros.

+0

¿En qué se diferencia esto de la respuesta aceptada? (También la razón por la cual es un error de tiempo de compilación es porque el compilador no puede determinar qué método llamar, entonces ¿cómo se supone que debe generar el código ejecutable correcto)? – UnholySheep

Cuestiones relacionadas