resolución de sobrecarga, lo que se llama al método

Gabriel Robaina:

Vamos a suponer que tengo una ComponentBaseclase, que es hijo de ObjectContextDecoratory 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 setmétodos en ObjectContextDecoratory ObjectContextson 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.

OscarRyz:

¿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 truepuede 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 Booleande 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=361916&siteId=1
Recomendado
Clasificación