2011-05-05 13 views
5

Tengo una pregunta relacionada con las clases internas de Java.clase interna de Java con el mismo nombre que otra clase de nivel superior

¿Hay alguna manera de acceder a la clase de nivel superior A desde la clase de nivel superior Principal que define la clase interna A?

A continuación se muestra el código de ejemplo que muestra el problema:

class A { // Outer Class A 
    { 
    System.out.println("A outer"); 
    } 
} 

class B { // Outer Class B 
    { 
    System.out.println("B outer"); 
    } 
} 

public class Main { 
    class A { // Inner Class A 
    { 
     System.out.println("A inner"); 
    } 
    } 

    public void newA() {  
    class A { // Local Class A 
     { 
     System.out.println("A local"); 
     } 
    } 
    new A(); 
    } 

    public static void main(String[] args) { 
    new Main().newA(); // prints "A local" 
    new Main().new A(); // prints "A inner" 
    //new A(); // compiler error: No enclosing instance of type Main is Accessible. 
    new B();  // but this works and prints "B outer" 
    } 
} 
+1

Trate de no volver a utilizar los nombres de clase, incluso entre los paquetes. Es probable que conduzca a la confusión. –

Respuesta

9

Usar el nombre completo de la clase:

new com.mypackage.A(); 
4

Si las clases son en paquetes, yo esperaría que para ser la forma más sencilla de lograr esto. No creo que haya ningún equivalente del C# global:: para Java, para forzar este tipo de cosas.

Aunque al final solo intenté cambiar los nombres de clase para evitar que el problema sucediera en primer lugar. Por lo general, es un mejor enfoque que usar soluciones temporales.

4

Debe proporcionar diferentes nombres de paquete para sus dos A s para que sean claramente diferentes tipos, luego puede hacer referencia a ellos por sus nombres completos.

Por ejemplo:

my.package.for.toplevel.A outerA = new my.package.for.toplevel.A(); // prints "A outer" 
                    // if this is the 
                    // package 

O mejor aún, utilizar dos nombres diferentes para dos clases distintas.

1

Sí, sólo tiene que utilizar paquetes o evitar nombrarlos el mismo desde el principio. Me pregunto cuál es tu razón para nombrarlos igual de todos modos?

Para explicar su error, se debe al hecho de que intenta acceder al A interno, pero como esa clase no está declarada como estática y no hay ninguna instancia principal disponible, no puede crear un A interno no estático. eso requiere una referencia a la instancia principal principal.

+1

Gracias me olvidé del truco de nombre de clase totalmente calificado. La pregunta era bastante teórica relacionada con los temas de SCJP (no es un problema real). Intento no utilizar construcciones tan extrañas :) – bary

3

Se dice que el nombre de la clase interna sombrea el nombre de la clase de nivel superior. La clase de nivel superior no puede ser referenciada por su nombre simple en el alcance de la clase interna; la clase de nivel superior solo puede referenciarse mediante un nombre calificado.

Si la clase de nivel superior está en el paquete predeterminado (en cuyo caso su nombre canónico es el mismo que su nombre simple), puede acceder a él a través de la reflexión.

+0

"Si la clase de nivel superior se encuentra en el paquete predeterminado (en cuyo caso su nombre canónico es el mismo que su nombre simple), puede acceder a él a través de la reflexión". ¿Puedes mostrar un ejemplo rápido? –

+1

@TrevorDixon: puede acceder al objeto de clase de la clase de nivel superior a través de java.lang.Class.forName (String), o mediante cualquier otro método que requiera el nombre binario o un nombre completo de la clase. Por ejemplo, dado 'class Name {class Name {/ * reference outer class here * /}}', el objeto Class del tipo type-level se puede obtener a través de Class.forName ("Name"). –

0

Se asume que las clases están en el paquete predeterminado. Para resolver el conflicto de nombres en este caso, necesita cambiar el nombre de las clases conflictivas o usar el paquete nombrado. Luego usa FQCN para resolver el problema.

Cuestiones relacionadas