2009-11-04 20 views
5

¿Es posible tener dos métodos con el mismo nombre pero diferentes parámetros y tipos de devolución en Java? Parece que sería una buena manera de generalizar un getter y un setter simple. ¿Puedes hacer eso con los constructores? ¿Por qué no con los métodos regulares? por ejemploentonces en Java no puede tener nombres de métodos duplicados con devolución y params diferentes?

por qué no ser capaz de hacer ..

int getVal() { 

return int; 
} 

boolean getVal() { 

return true; 

} 

setVal(int a) { 
} 

y

setVal(boolean a) { 

} 
+0

posible duplicado de [Java -? Qué tipo de retorno sobrecarga de métodos basados] (http://stackoverflow.com/questions/2744511/java-why-no-return-type-based-method-overloading) – nawfal

Respuesta

11

Porque entonces el compilador no sería capaz de averiguar:

 
setVal(getVal()); 

que debe llamar a la versión bool o int?

+0

si recibe un booleano como parámetro, entonces debe usar el setVal que acepta y establece un valor booleano – Ayrad

+0

como cuando un constructor acepta parámetros diferentes pero puede tener el mismo nombre – Ayrad

+4

Pero, ¿cómo podría el compilador seleccionar la versión bool de getVal en primer lugar? Claramente tiene dos elecciones igualmente válidas. –

15

Lo que se puede esperar si llamara:

getVal(); 

sin retorno vaue siendo recopilada ? Tiene dos opciones: la variante booleana o entera. Dado que no se puede aplicar el valor de retorno que se recopilará, el compilador no puede determinar qué variante se llamará.

Puede sobrecargar los parámetros del método, pero no solo en los tipos de devolución, ya que eso es ambiguo (como se muestra arriba).

+0

idealmente si es un booleano que lo llama ... por ejemplo ... if (getVal == true) entonces debe llamar al getVal que devuelve un verdadero .. de lo contrario si es int a = getVal() debe llamar al uno que devuelve un int. – Ayrad

+2

Como he ilustrado, no puede * forzar * un valor de retorno en este –

3

Diferentes tipos de devolución, no. Pero diferentes tipos de parámetros/longitud, sí. Así es Java ... la especificación dice eso. Querían mantenerlo simple.

+0

Lo mismo aplica para C++ también. – Raze

6

A primera vista, puede parecer que no debería existir una razón por la que no se deba permitir esto, pero piense desde la perspectiva del código que debe llamar a este (s) método (s), cómo ¿Sabría qué método invocar?

De java.sun.com

El lenguaje de programación Java soporta la sobrecarga de métodos, y Java puede distinguir entre métodos con diferentes firmas de métodos. Esto significa que los métodos dentro de una clase pueden tener el mismo nombre si tienen diferentes listas de parámetros (hay algunas calificaciones que se discutirán en la lección titulada "Interfaces y herencia").

Los métodos sobrecargados se diferencian por el número y el tipo de argumentos pasados ​​al método.

No se puede declarar más de un método con el mismo nombre y el mismo número y tipo de argumentos, porque el compilador no les puede decir apar t.

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.

+0

En realidad, hay una razón: tipos de devolución covariantes utilizando métodos de puente. – eljenso

+0

El compilador no puede. Pero jvm puede. J –

5

En cuanto a la Máquina Virtual de Java se refiere, es posible para una clase para declarar varios métodos con la misma firma, pero diferentes tipos de retorno.

Solo, Java como idioma prohíbe esto.

0

Usted can declare los dos incubadores en su caso - pruébelo.

Los métodos deben ser únicos en cuanto a su nombre, y el número y tipo de sus argumentos. El tipo de devolución, así como la cláusula throws, no cuentan en términos de hacer que un método sea único (lo cual tiene sentido, ya que no están especificados cuando lo invocan).

4

En general, no. Pero si usted quiere mucho - después YES :)) Marque esta great article

+0

+2 por artículo interesante, -1 por el * horror * de pensar que la gente realmente podría hacer eso. :-P –

+0

Totalmente de acuerdo con usted. Una situación en la que será * realmente * necesario: código heredado donde agregar fácilmente un nuevo gancho que reescribir todo. –

+0

¡Es un gran hallazgo! – Raze

0

De acuerdo con la especificación del lenguaje Java (http://docs.oracle.com/javase/specs/jls/se5.0/html /classes.html#8.4.2):

es un error de tiempo de compilación para declarar dos métodos con firmas de anulación en el equivalente (definidos a continuación) en una clase.

Dos métodos tienen la misma firma si tienen el mismo nombre y tipos de argumento .

Cuestiones relacionadas