2010-06-13 19 views
16

tengo el siguiente código:
¿Cuál es la explicación de este código java?

public class Main { 
    public void method(Object o) 
    { 
      System.out.println("Object Version"); 
    } 
    public void method(String s) 
    { 
      System.out.println("String Version"); 
    } 
    public static void main(String args[]) 
    { 
      Main question = new Main(); 
      question.method(null);//1 
    } 
} 

¿Por qué el resultado es "Versión Cadena"? y ¿por qué hay un error de compilación si el primer método toma un objeto StringBuffer?
Otro caso: si el primer método toma un objeto StringBuffer y escribo question.method("word");, el resultado será "Versión de cadena". Por qué ? ¿Por qué no hay error de compilación?

+0

Curioso. Me hubiera esperado un compilador no se quejan, pero tal vez el hecho de que hay una relación de tipo entre las dos clases de argumentos ('string' siendo la más específica) cambia las cosas y este es un caso en el JLS? El caso de 'StringBuffer' es fácil, ya que definitivamente es ambiguo. –

+1

@tercera pregunta: por supuesto que no obtendrá un error. Estás pasando un String, por lo que obviamente se invocará el método con el parámetro String. No hay nada para que el compilador se confunda. – someguy

Respuesta

23

La especificación JAVA dice que en casos como este, se llamará a la función más específica. Dado que String es un subtipo de Object, se llamará al segundo método. Si cambia el objeto a StringBuffer, no hay un método específico, ya que StringBuffer no es un subtipo de cadena y viceversa. En este caso, el compilador no sabe qué método llamar, de ahí el error.

1

Al mirar el otro caso: com.snamellit

paquete;

public class Main { 
    public void method(Object o) { 
     System.out.println("Object Version"); 
    } 

    public void method(String s) { 
     System.out.println("String Version"); 
    } 

    public static void main(String args[]) { 
     Main question = new Main(); 
     question.method("word"); 
    } 
} 

Si el primer método tqkes un StringBuffer y la segunda una cadena, no hay confusión posible como "palabra" es una cadena y no un StringBuffer.

En Java la identidad de una función/método depende en 3 cosas: el nombre, el tipo PF los parámetros (también conocido como la firma argumento) y el cargador de clases. Como ambos tipos tienen una firma de argumento diferente, el compilador puede elegir fácilmente el correcto y no genera un error.

+0

Pero _sea__ generar un error: ¿podrías elaborarlo, Peter? –

+0

gracias Peter.I pensaron que un error del compilador debería ocurrir, ya que "palabra" es un valor válido StringBuffer. –

+2

No, es una cadena, no un StringBuffer. StringBuffers es el primo mutable de Strings, que son inmutables y, por lo tanto, un excelente modelo para cadenas literales. Un hombre sabio dijo: "En caso de duda, Pruébalo": System.out.println (. "Palabra" .getClass() getName()) se imprimirá java.lang.String. –

Cuestiones relacionadas