Supongamos que tengo una ComponentBase
clase, de quien es hijo ObjectContextDecorator
y nieto ObjectContext
.
public class ComponentBase extends ObjectContextDecorator {
}
public class ObjectContextDecorator extends ObjectContext {
public void set(String objectTypePath, String characteristicName, Object value) {
//...
}
}
public class ObjectContext {
public void set(String characteristicName, Object value, boolean forced) {
//...
}
}
Los set
métodos en ObjectContextDecorator
y ObjectContext
son muy similares. Considere este código de muestra:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
Las firmas de ambos métodos se ajustan a la que se llama correctamente. No puedo cambiar las firmas de los métodos ya que no es mi código.
¿Cómo sabe el compilador a qué método pretendía llamar?
Sé que en el IDE puedes señalar a qué método realmente quieres llamar, pero en esta situación, estoy usando un cargador de clases para cargar una clase que tiene un método que contiene el código de muestra.
java
overloading
method-signature
Gabriel Robaina
fuente
fuente
String, String, boolean
. Se llamará al método más específico. Todo esto está en el JLS."this"
)Respuestas:
Comprueba los argumentos y determina cuál es más específico siguiendo las reglas descritas. JLS §15.2
En su caso, la llamada:
los argumentos son
String
,String
,boolean
Que coincide con la primera clase (los nombres de los parámetros cambiaron por brevedad )
La segunda clase no se invoca porque el tercer parámetro es un
Object
:y aunque el valor booleano
true
puede coincidir si está en caja automática, el primero es más específico. La regla que se aplica aquí es:Pero, por ejemplo, si usa el contenedor de objetos
Boolean
en la firma:Luego ambos coincidirán, y el compilador le informará con el siguiente mensaje:
Pero ese no es el caso en su ejemplo.
fuente
Todo se explica en el JLS §15.2 expresiones de invocación del método . Le informa todo sobre cómo se elige el método correcto para llamar. Y tenga en cuenta que esto no siempre tiene éxito.
En su caso específico, los dos métodos son sobrecargas entre sí, por lo que se aplica el §15.2.2 "Paso 2 del tiempo de compilación: determinar la firma del método": qué sobrecarga para llamar se determina en el momento de la compilación. Este paso se divide en 3 fases.
En la primera fase, el compilador intenta encontrar métodos aplicables sin permitir conversiones de boxeo. En su caso, para llamar a la sobrecarga que toma una
Object
, se necesita una conversión de boxeo para convertirlaboolean
true
al tipoObject
, de modo que la sobrecarga no se elija en la primera fase.Bueno, nosotros hemos encontrado exactamente un método, por lo que nos limitaremos a elegir ese método. No hay ambigüedad.
fuente