declaracion import en java
¿Por qué son legales las importaciones estáticas de métodos estáticos con los mismos nombres? (3)
Es porque ha nombrado a todas estas clases lo mismo. Cada vez que llamas a este método estático busca en la clase más local que en este caso es el A1 en p3 que no contiene el método estático a (). Recuerde siempre que el nombre de clase debe ser único y nunca igual a otro.
Digamos que tenemos estos paquetes y clases:
package p1;
public class A1 {
public static void a() {}
}
package p2;
public class A1 {
public static void a() {}
}
package p3;
import static p1.A1.a;
import static p2.A1.a;
public class A1 {
public static void test() {
}
}
Me pregunto por qué la importación estática de métodos es legal (no dará como resultado un error de tiempo de compilación) en el paquete p3
. No podremos utilizarlos más en el método de test()
ya que dicho uso dará como resultado el error de tiempo de compilación.
Por qué no es lo mismo que con una importación normal de clases. Digamos que nos gustaría importar las clases A1
de los paquetes p1
y p2
a p3
:
package p3;
import p1.A1;
import p2.A1;
tal importación es ilegal y dará como resultado el error de tiempo de compilación.
La ambigüedad de las importaciones estáticas de métodos podría resolverse en el momento de la invocación del método.
Por ejemplo, si tenía una importación estática para dos métodos que se ven así:
void frobnicate(int i);
// and
void frobnicate(boolean b);
Entonces podría importar y usar ambos, porque el compilador podría decir cuál utilizar, según los argumentos que pase ( frobnicate(1)
llama al primero, frobnicate(true)
llama al segundo).
Con las clases, eso no es posible: Foobar a;
solo no es suficiente para decirte cuál de las dos clases de Foobar
quieres.
También tenga en cuenta que una única importación estática puede importar múltiples nombres. De acuerdo con la sección relevante del JLS (énfasis mío):
Una declaración de importación estática única importa todos los miembros estáticos accesibles con un nombre simple determinado de un tipo.
Por ejemplo, si los dos métodos de frobnicate
anteriores están ubicados en la misma clase, una única importación static
podría importarlos a ambos.
Supongo que, no respaldado por especificaciones del lenguaje, los métodos pueden estar sobrecargados, pero los campos / tipos no pueden; por lo tanto, java permite importar métodos del mismo nombre de diferentes clases.
Sin embargo, dos métodos de la misma firma no pueden existir en la misma clase; tampoco deberían estar permitidos por las importaciones.
Incluso si los dos métodos tienen diferentes firmas, sigue siendo una mala idea. El significado de un nombre es muy importante, debe tener claridad. Podemos manejar métodos sobrecargados de 1 clase, pero la "sobrecarga" en toda la clase es exagerada.