(...) pero cuando utilizamos cualquier tipo de clase Envoltura de objetos se usa decir suponer Entero como seguir
Integer i = new Integer(10)
System.out.println(i);
es que toString() es responsable de la impresión o Unboxing ?
Estás pasando un Object
a println
por lo que es, obviamente, println(Object obj)
que se llama el que escribe la salida de String.valueOf(obj)
que exige obj.toString()
si obj
no es null
.
PD: Sin ánimo de ofender, ¿por qué no mira las fuentes?
Actualización: Quizás me haya perdido el sentido de la pregunta (lo cual es engañoso en su forma actual si puedo). En realidad, la pregunta podría ser:
(...) pero cuando utilizamos cualquier tipo clase de contenedor se utiliza de objetos decir supongamos Entero como seguir
Integer i = new Integer(10)
System.out.println(i);
¿Qué método se llama: println(Object)
o println(int)
?
Si esto es de lo que se trata la pregunta, entonces la respuesta yace por supuesto en The Java Language Specification. Para simplificar, el método invocado en tiempo de ejecución será el método que se determina en tiempo de compilación. Ahora, ¿cómo determina el compilador el método que se invocará? Bueno, esto se explica en la sección 15.12 Method Invocation Expressions. No cubriré todos los detalles, la especificación lo hace mejor que yo pero, básicamente, el primer paso es encontrar la clase o interfaz para buscar, el segundo paso es encontrar todos los métodos aplicables y luego recoger los más específicos método, el tercer paso es verificar si el método elegido es apropiado. Me centraré en el segundo paso (que es el más interesante aquí). Como se detalla en la sección 15.12.2 Compile-Time Step 2: Determine Method Signature:
Un método es aplicable si es o bien aplicable por subtipificación (§15.12.2.2), aplicable por invocación de método conversión (§15.12.2.3), o que es un método aridad variable de aplicable (§15.12.2.4).
El proceso de determinar aplicabilidad comienza determinando los métodos potencialmente aplicables (§15.12.2.1). El resto del proceso se divide en tres fases.
Discusión
El propósito de la división en fases es asegurar la compatibilidad con las versiones anteriores de la programación en Java idioma.
la primera fase (§15.12.2.2) realiza sobrecarga de resolución sin boxeo permitiendo o unboxing conversión , o el uso de la variable aridad invocación de método. Si no se encuentra el método aplicable durante esta fase , el procesamiento continúa hasta la segunda fase .
Discusión
Esto garantiza que cualquier llamada que eran válidos en las versiones anteriores de la lengua no se consideran ambigua como resultado de la introducción de métodos Arity variables, implícita boxeo y/o unboxing.
la segunda fase (§15.12.2.3) realiza sobrecarga resolución mientras permitiendo boxeo y unboxing, pero todavía impide el uso de la variable aridad invocación de método. Si no se encuentra el método aplicable durante esta fase , el procesamiento continúa hasta la tercera fase .
Discusión
Esto asegura que una variable método aridad Nunca se invoca si existe un método aridad fijo aplicable .
La tercera fase (§15.12.2.4) permite la sobrecarga para ser combinado con métodos Arity variables, el boxeo y unboxing.
decidir si un método es voluntad aplicable, en el caso de métodos genéricos (§8.4.4), requieren que los argumentos de tipo real sean determinar. Los argumentos de tipo reales pueden pasar explícita o implícitamente. Si se pasan de forma implícita, deben inferirse (§15.12.2.7) a partir de los tipos de las expresiones de argumento.
Si han han identificado varios métodos aplicables durante uno de los tres fases de pruebas aplicabilidad, entonces se elige el más específico, como se especifica en la sección §15.12.2.5. Consulte las siguientes subsecciones para obtener detalles sobre .
En este caso particular, println(Obj)
es aplicable por subtipificación (y println(int)
sería aplicable por conversión invocación como el boxeo/unboxing es una conversión (§5.3)). Entonces el compilador ingresará el phase 1. Y si miramos la última oración:
Si no se encuentra un método aplicable por subtipificación, la búsqueda de los métodos aplicables continúa con la fase 2 (§15.12.2.3). De lo contrario, el método más específico (§15.12.2.5) se elige entre los métodos que se aplican al subtipar.
Aquí, no hay otros métodos aplicables por subtipificación por lo que este es el final, println(Object)
se invocará (y por lo tanto toString()
será llamada, responder a la pregunta inicial).
Creo que solo sería unbox en casos donde int era la única opción. Dado que hay un println (Object), probablemente lo llamen. –
@gurukulki, actualizado por respuesta espero que ayude. –