Java no puede averiguar el método que se invoca

Mikhailov Valentine:

No he encontrado la razón ( en JLS ) por qué Java compilador no puede chouse método apropiado para ejecutar en el siguiente programa:

public class UpperLevelClass {
    private static String getStringanotherNameMethod(String a, String b) {
        return null;
    }

    private static String firstSignatureMethod(String a, String b) {
        return null;
    }

    static class StaticNestedClass extends UpperLevelClass{
        public void getStringfirstNameMethod(String a, Integer b) {
            getStringanotherNameMethod("test", "fff");//compiles
            firstNameMethod("test", "fff");//error below
        }
    }
}

Compilar con acabados siguiente error:

error: method firstNameMethod in class StaticNestedClass cannot be applied to given types;
            firstNameMethod("test", "fff");
            ^
  required: String,Integer
  found: String,String
  reason: argument mismatch; String cannot be converted to Integer

Agregando un poco de historia:

Al principio tenía varias staticmétodo de defaultacceso en las llamadas de nivel superior y compila y se ejecuta everething (de clase anidada estática) de multa. Entonces staticacceso métodos se cambió a privatey programm deja de compilar debido a un error en un método (en este caso firstNameMethod), pero otros métodos compila bien.


He tratado (gracias a @ Jorn Vernee ) para compilar y ejecutar Programm en Eclipse y se compila y se ejecuta.

Joe C:

Busca el método apropiado es un proceso de dos pasos.

Paso 1 implica la selección de la clase a buscar. La línea correspondiente de los JLS de este paso:

Si el identificador aparece en el alcance de una declaración de método visible con ese nombre:

Si hay una declaración de tipo que enmarque a la que este método es miembro, sea T la declaración de tipo de tales interna. La clase o interfaz de búsqueda es T.

Tenga en cuenta que dice identificador y no Firma aquí. Esto significa que sólo está mirando el nombre del método en esta etapa, y no los argumentos. Debido a que StaticNestedClasscontiene un método llamado getString, es decir la clase a buscar.

Es sólo cuando se llega a la Etapa 2 que los argumentos se tienen en cuenta. Debido a que no hay getStringmétodo en el StaticNestedClassque son compatibles con la llamada al método, esta compilación conduce al fracaso.

Supongo que te gusta

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