2011-04-06 22 views
71

¿Pueden dos métodos Java tener el mismo nombre con diferente tipo de retorno? El tipo de devolución de los métodos es diferente y se declaran con el mismo nombre de método.¿Pueden dos métodos Java tener el mismo nombre con diferentes tipos de devolución?

¿Eso está permitido?

+10

@Aleadam - ¿Importa? El OP está pidiendo información ... no código. –

+0

@Stephen sí, pero es muy fácil encontrar información que se puede encontrar en los primeros capítulos de cualquier libro, es por eso que estoy preguntando. – Aleadam

+0

¿Estás tratando de decir la misma firma o solo el nombre del método? Esto hace mucha diferencia – Ravisha

Respuesta

2

Solo si sus declaraciones de parámetros son diferentes de la memoria.

27

Solo si aceptan otros parámetros. Si no hay parámetros, entonces debe tener diferentes nombres.

int doSomething(String s); 
String doSomething(int); // this is fine 


int doSomething(String s); 
String doSomething(String s); // this is not 
+1

No solo. int doSomething (cadena) y String dosomething (String) tiene diferentes tipos de devolución, por lo que la firma en Java Bytecode también es diferente, por lo que está permitido. Para invocar este método, debe usar reflection o bytecode. – barwnikk

+0

@barwnikk: Claro, pero los tipos de devolución no tienen nada que ver con eso; también tienen diferentes nombres debido a la diferencia en mayúsculas. – Kaivosukeltaja

+0

La diferencia en las mayúsculas es porque mi clave de mayúsculas está rota. ;) puede crear dos métodos con los mismos argumentos y el nombre del método, pero solo valores de retorno diferentes. Pero tendrás problemas en Eclipse. Cuando llame al método, obtendrá un error, por lo que debe usar bytecode. ;) Muchos ofuscadores usan esto. El nombre de la clase puede ser "si", "do", "para", si conoce bytecode. – barwnikk

6

Nº C++ y Java tanto no permitir la sobrecarga de tipo de retorno de una función. La razón es que la sobrecarga en el tipo de retorno puede ser confusa (puede ser difícil para los desarrolladores predecir a qué sobrecarga se llamará). De hecho, hay quienes argumentan que cualquier sobrecarga puede ser confusa a este respecto y recomendar en contra, pero incluso aquellos que están a favor de la sobrecarga parecen estar de acuerdo en que esta forma particular es demasiado confusa.

+0

En Java (al menos), dos métodos pueden tener el mismo nombre y diferentes tipos de devolución ** siempre que ** tengan también diferentes tipos de argumentos; vea la sección JLS vinculada por la respuesta de @ uthark. –

+0

Correcto, pero eso no es una sobrecarga en el tipo de retorno, es decir, una sobrecarga en el tipo de parámetro. Y la sobrecarga simplemente tiene un tipo de devolución diferente (el tipo de devolución no está relacionado con la sobrecarga). –

69

Si ambos métodos tienen los mismos tipos de parámetros, pero diferente tipo de devolución que no es posible. De Java Language Specification, Java SE 8 Edition, §8.4.2. Method Signature:

dos métodos o constructores, M y N, tienen la misma firma si tienen el mismo nombre, los mismos parámetros de tipo (si los hay) (§8.4.4), y, después de la adaptación de los formales tipos de parámetros de N a los parámetros de tipo de M, los mismos tipos de parámetros formales.

Si ambos métodos tienen diferentes tipos de parámetros (por lo tanto, tienen una firma diferente), entonces es posible. Se llama sobrecarga.

+8

+1 para vincular a la especificación ... y ser correcto y claro. –

+0

¿Pero por qué sería esto útil? – user3932000

4

Puede tener dos métodos con los mismos argumentos y diferentes tipos de devolución solo si uno de los métodos es heredado y los tipos de devolución son compatibles.

Por ejemplo:

public class A 
{ 
    Object foo() { return null; } 
} 

public class B 
    extends A 
{ 
    String foo() { return null; } 
} 
+1

Es cierto, acabo de descubrir esto hoy más temprano. Si llama a 'B.class.getDeclaredMethods()', verá que ambos aparecen. Puede llamar a cualquiera de las versiones a través de la reflexión. – Kidburla

18

Según el JLS, no puede sin embargo debido a una característica/error en el compilador de Java 6/7 (JDK de Oracle, OpenJDK, el JDK de IBM) puede tener diferentes tipos de retorno para la misma firma de método si usa genéricos.

public class Main { 
    public static void main(String... args) { 
     Main.<Integer>print(); 
     Main.<Short>print(); 
     Main.<Byte>print(); 
     Main.<Void>print(); 
    } 

    public static <T extends Integer> int print() { 
     System.out.println("here - Integer"); 
     return 0; 
    } 
    public static <T extends Short> short print() { 
     System.out.println("here - Short"); 
     return 0; 
    } 
    public static <T extends Byte> byte print() { 
     System.out.println("here - Byte"); 
     return 0; 
    } 
    public static <T extends Void> void print() { 
     System.out.println("here - Void"); 
    } 
} 

imprime

here - Integer 
here - Short 
here - Byte 
here - Void 

Para más detalles, read my article here

+2

JLS permite estos 4 métodos, incluso si tienen el mismo tipo de devolución.En realidad, el tipo de devolución no se considera en absoluto cuando se habla de sobrecarga (n. ° 8.4.2). Por lo tanto, no es un error, según la especificación del idioma actual, permitir estos 4 métodos. Sin embargo, javac no puede compilarlos si tienen el mismo tipo de devolución, ese * es * un error. Es la especificación del lenguaje culpable del error; no pensaron todo el asunto de los genéricos con mucho cuidado. – irreputable

+0

@irreputable, Estoy de acuerdo con los genéricos, por lo que pensé que la demora de los cierres podría ser algo bueno si significaba que el diseño estaba bien pensado. ;) Solo mira lo que tienes que hacer para crear una variedad de genéricos, o el uso de moldes dobles y triples, o el hecho de que incluso 'java.util.ArrayList' no se compila sin advertencias (llegó a ser el más básico de casos de uso) –

1

Si está en la misma clase con el mismo número de parámetros con los mismos tipos y orden, entonces no es posible ejemplo:

int methoda(String a,int b) { 
     return b; 
} 
String methoda(String b,int c) { 
     return b;  
} 

si el número de parámetros y sus tipos es el mismo pero el orden es diferente, entonces es posible, ya que da como resultado la sobrecarga del método. Significa si la firma del método es la misma, lo que incluye el nombre del método con el número de parámetros y sus tipos y el orden en que se definen.

1

Incluso si se trata de un viejo hilo, tal vez algunos se interesa.

Si se trata de una opción para que usted pueda utilizar el mismo método dentro de la misma clase y archivar diferentes tipos de retorno, utilice los genéricos: Oracle Lesson Generics

ejemplo simple para la clase de soporte de valor genérico:

class GenericValue<T> { 
    private T myValue; 

    public GenericValue(T myValue) { this.myValue = myValue; } 

    public T getVal() { return myValue; } 
} 
Y

utilizar de esta manera:

public class ExampleGenericValue { 
    public static void main(String[] args) { 
    GenericValue<Integer> intVal = new GenericValue<Integer>(10); 
    GenericValue<String> strVal = new GenericValue<String>("go on ..."); 

    System.out.format("I: %d\nS: %s\n", intVal.getVal(), strVal.getVal()); 
    } 
} 

... resultará en la siguiente salida:

I: 10 
S: go on ... 
Cuestiones relacionadas