2010-10-11 8 views
10

Estoy teniendo una clase 'ClassA' que tiene un constructor privado.Cómo resolver 'El super constructor implicit classA() no está visible. Debe invocar explícitamente a otro constructor '?

public final class ClassA{ 
    private ClassA{ 
    } 

    public static void main(String[] arg) }{ 
    ; 
    ; 
    ; 
    } 
} 

Ahora, yo estoy extendiendo la clase 'claseA' [última palabra clave se elimina antes de hacer esto]

public class ClassB extends ClassA{ 
    public static void main(String[] arg) }{ 
     ; 
     ; 
     ; 
     } 

} 

Ahora, que estoy recibiendo Implicit super constructor classA() is not visible. Must explicitly invoke another constructor. ¿Qué significa y cómo resolver esto?

Nota No puedo cambiar el especificador de acceso del constructor ClassA.

+1

I pensó que notó que no puede cambiar el acceso para el constructor de ClassA ... – Bivas

+0

@Bivas: sí, pero nadie parece responder más que cambiar de privado a público/protegido –

+1

Sí lo hice (solución de composición) :-) – Bivas

Respuesta

6

Cambia la visibilidad del constructor de ClassA de private a protected.

Los constructores siempre comienzan llamando a un constructor de superclase. Si el constructor contiene explícitamente una llamada a un constructor de superclase, se usa ese constructor. De lo contrario, el constructor sin parámetros está implícito. Si el constructor sin argumentos no existe o no es visible para la subclase, se obtiene un error en tiempo de compilación.

+0

Como todas las respuestas son sobre cambiar el especificador de acceso, estoy aceptando el que vino primero. :) –

2

Cambiando private ClassA{} a protected ClassA{} suena como una buena solución.

Siempre se llama al constructor padre en la clase hija: implícitamente o no. Por lo tanto, su definición es equivalente a ClassB

public ClassB extends ClassA { 
    public ClassB() { 
     super(); 
    } 

    // all other methods you have go here... 
} 

Si el único constructor de ClassA es privado, no puede ser llamado desde ClassB.

2

Java creará implícitamente un constructor sin parámetros para ClassB, que llamará a super(). En su caso, el constructor en ClassA no está visible, de ahí el error que está recibiendo. Cambiar la visibilidad a público o protegido resolverá el error.

+1

i no puede cambiar el constructor a public –

7

Yo sugeriría composición en lugar de herencia (tal vez eso es lo que el diseñador de ClassA destinado para el uso de la clase Ejemplo:..

 
public class ClassB { 
    private ClassA classA; 

    ClassB() { 
     // init classA 
     ... 
    } 

    public ClassA asClassA() { 
     return classA; 
    } 

    // other methods and members for ClassB extension 
} 

Puede delegar métodos de ClassB a ClassA o anularlos

Cuestiones relacionadas