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 static
método de default
acceso en las llamadas de nivel superior y compila y se ejecuta everething (de clase anidada estática) de multa. Entonces static
acceso métodos se cambió a private
y 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.
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 StaticNestedClass
contiene 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 getString
método en el StaticNestedClass
que son compatibles con la llamada al método, esta compilación conduce al fracaso.