Vamos a suponer que tengo una ComponentBase
clase, que es hijo de ObjectContextDecorator
y nieto de 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 simillar. Considere este código de ejemplo:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
Ambos métodos firmas encajan el que está siendo llamado correctamente. No soy capaz de cambiar las firmas de los métodos ya que no es mi código.
¿De qué manera los conocimientos compilador qué método tenía la intención de llamar?
Sé que en el IDE se puede señalar el método que en realidad la intención de llamada, 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 ejemplo.
¿De qué manera los conocimientos compilador qué método tenía la intención de llamar?
Se comprueba para los argumentos y determina cuál es más específico siguiendo las reglas descritas JLS §15.2
En su caso, la llamada:
base.set("OTM4E_EFFLEVEL", "IE1 / STD", true)
los argumentos son String
, String
,boolean
Que coincide con la primera clase ( nombres de los parámetros cambiados por razones de brevedad )
public class ObjectContext {
public void set(String s, Object o, boolean b){
//...
}
}
La segunda clase está no invoca porque el tercer parámetro es un Object
:
public class ObjectContextDecorator extends ObjectContext {
public void set(String s, String ss, Object thisOneRightHere) {
//...
}
}
y mientras que el valor booleano true
puede igualar si se autoboxed siendo el primero de ellos es más específico. La regla que se aplica aquí es:
La primera fase (§15.12.2.2) lleva a cabo la sobrecarga de resolución sin permitir que el boxeo o conversión unboxing
Pero, por ejemplo, si se utiliza el contenedor de objetos Boolean
de la firma:
public class ObjectContext {
public void set(String s, Object o, Boolean b){ //<-- third param changed from boolean to Boolean
//...
}
}
A continuación, lo harán tanto partido, y el compilador permitirá saber con el siguiente mensaje:
> A.java:25: error: reference to set is ambiguous
> base.set("OTM4E_EFFLEVEL", "IE1 / STD", true);
> ^ both method set(String,Object,Boolean) in ObjectContext and method set(String,String,Object) in ObjectContextDecorator match
Pero eso no es el caso en su ejemplo.