Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

196
Vistas
¿Por qué no se permite el uso de la clase interna en el parámetro de tipo genérico de la clase externa si la clase interna es privada?

Esta es quizás una pregunta tonta, pero estoy bastante sorprendido de ver que no se permite usar la clase interna privada como un tipo genérico en la clase externa.

Si hago que la clase interna esté protegida, se compila bien.

Además, tengo que precisar Outer.Inner en lugar de solo Inner , de lo contrario, no se encuentra la clase interna. Esto también se ve un poco raro.

¿Por qué Inner no puede ser privado? ¿Y por qué se permite protegerlo?

 public class Outer extends AbstractSet<Outer.Inner> { private static class Inner { // ... } // ... }

el error es:

 Outer.java:3: error: Inner has private access in Outer public class Outer extends AbstractSet<Outer.Inner> { ^ 1 error

Estoy usando Java SE 17, pero creo que no importa mucho.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tenga en cuenta el significado de private de la especificación de idioma §6.6.1 , énfasis mío:

De lo contrario, el miembro o constructor se declara privado. Solo se permite el acceso cuando se produce desde el interior del cuerpo de la clase o interfaz de nivel superior que incluye la declaración del miembro o constructor.

La cláusula extends no es parte del cuerpo de la clase. La sintaxis para una declaración de clase se ve así ( Clases ):

 NormalClassDeclaration: {ClassModifier} class TypeIdentifier [TypeParameters] [ClassExtends] [ClassImplements] [ClassPermits] ClassBody ClassBody: { {ClassBodyDeclaration} }

El "cuerpo" de la clase se refiere estrictamente a las cosas dentro de las llaves. Por lo tanto, no puede acceder a la clase privada Inner en la cláusula extends .

Si Inner es protected o package-private, por otro lado, entonces se permite el acceso, porque ambos permiten el acceso desde el mismo paquete.

De manera similar, el alcance de una declaración de clase miembro también es el cuerpo de la clase ( §6.3 ):

El alcance de una declaración de un miembro m declarado en o heredado por una clase o interfaz C (§8.2, §9.2) es el cuerpo completo de C, incluidas las declaraciones de clase o interfaz anidadas.

Por lo tanto, la cláusula extends no está dentro del alcance de la clase Inner , por lo que debe usar un nombre más calificado para referirse a ella, en lugar de su nombre simple.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda