2011-11-18 23 views
16

Considere el siguiente código:Ningún caso encerrando de tipo PerfHelper está disponible debido a alguna invocación del constructor intermedia

class abstract Normal1 extends Something 
{ 
} 

class Outer 
{ 
    class abstract Inner extends Normal1 
    { 

    } 
} 

class General extends Outer.Inner // Problem occurs at this 
{ 
} 

El error que estoy recibiendo es "Ningún caso encerrando de tipo PerfHelper está disponible debido a alguna invocación del constructor intermedia "

Mi pregunta es ¿puedo extender la clase interna como arriba?

+0

Aparte de la respuesta a su pregunta (las clases internas están ligados a una instancia que encierra de su clase externa menos que se declare estática), ¿por qué querrías hacer algo tan complicado? Tratar de extender una clase interna en un contexto no relacionado es probablemente una señal de que debes dividirlos en sus propias clases. –

+0

escenario diferente


clase Normal1 extracto se extiende algo { } exterior clase extiende Normal1 <== change1 { clase abstracta interior se extiende exterior <== cambio 2 { } } clase General extends outer.inner <== El problema ocurre en este { }

cuál es la solución para este – user911333

+1

¿Dónde se usa 'PerfHelper' en su ejemplo? – Eric

Respuesta

22

declarar la clase interna estática y usted debería ser capaz de extenderlo:

class outer { 
    static abstract class inner extends normal1 { } 
} 

Si interno no es abstracto, está ligado a la externa, y sólo puede existir cuando existe una instancia del exterior. Verifica si esto es lo que realmente quieres.

+0

La clase interna estática funciona bien ..
No podemos extender sin usar estática – user911333

1

Pruebe esto, (Lea la clase anidada inheritance rules).

abstract class normal1 extends something { } 

class outer 
{ 
    abstract class inner extends normal1{} 
} 

class Outer1 extends outer 
{ 
    class General extends inner {} 
} 
5

clase anidada son como (en el sentido) Propiedad de una clase.

  1. Como en el caso de variable de instancia sólo cuando esté disponible cuando se crea su objeto como mismo que inner clase también disponible cuando se creado objeto de exterior.

lo tanto, si desea ampliar esta luego haga su clase interna como static inner class
Como jordao sugerir por encima de

1

En la clase general modificar su constructor para llamar a un constructor de la clase súper interior. aquí está el código ..

public General(){ 
    new outer().super(); 
} 
Cuestiones relacionadas