¿Por qué no es posible sobrecargar una función simplemente cambiando el tipo de retorno? ¿Cambiará eso en una versión futura de Java?
Por cierto, solo como referencia, ¿es esto posible en C ++?
¿Por qué no es posible sobrecargar una función simplemente cambiando el tipo de retorno? ¿Cambiará eso en una versión futura de Java?
Por cierto, solo como referencia, ¿es esto posible en C ++?
Respuestas:
No puede hacerlo en Java y no puede hacerlo en C ++. La razón es que el valor de retorno por sí solo no es suficiente para que el compilador averigüe qué función llamar:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, lo es double
.
foo();
sin un tipo de retorno sea ambiguo no es necesariamente una razón para no permitirlo como una sobrecarga. Hay argumentos que pueden causar ambigüedad (por ejemplo foo(null);
), pero eso no hace que la sobrecarga sea inherentemente inválida.
La razón es que las sobrecargas en Java solo se permiten para métodos con diferentes firmas .
El tipo de retorno no forma parte de la firma del método, por lo que no se puede usar para distinguir sobrecargas.
Consulte Definición de métodos de los tutoriales de Java.
calculateAnswer(double, int, double, double)
". Vea que el tipo de retorno no esté incluido, @konmik.
Antes de Java 5.0, cuando se reemplaza un método, tanto los parámetros como el tipo de retorno deben coincidir exactamente. En Java 5.0, introduce una nueva función denominada 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.
Overloaded
Los métodos en java pueden tener diferentes tipos de retorno dado que el argumento también es diferente.
Mira el código de muestra.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
El tipo de retorno no importa mientras se sobrecarga un método. ¡Solo tenemos que asegurarnos de que no haya ambigüedad!
La única forma en que Java puede saber qué método llamar es diferenciando 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 cuál debería llamar.
El compilador no considera el tipo de retorno al diferenciar los métodos, por lo que no puede declarar dos métodos con la misma firma incluso si tienen un tipo de retorno diferente.
Si está al tanto de la ejecución de la función, entonces sabrá que cuando llamamos a una función, la parte de la definición se ejecuta y finalmente requerimos la declaración de retorno, por lo tanto, podemos decir que el retorno viene después de la definición completa de la función, por eso si hay dos o más funciones con el mismo nombre y con el mismo tipo y no. de argumentos en el momento de llamar, cómo el compilador sabrá sobre cuál llamar, porque el nombre de la función y los parámetros son los mismos. En el momento de llamar, en primer lugar, todo el enfoque estará en los argumentos y el nombre de la función y, después de completar la definición de la función, por fin nos ocuparemos de la declaración de retorno.
Compile Time Error es mejor que Run Time Error. Por lo tanto, el compilador de Java muestra un error de tiempo del compilador si declara que el mismo método tiene los mismos parámetros.
no, no es realmente posible de esa manera, solo puede sobrecargar por el número de argumentos o el tipo de datos de los argumentos