De acuerdo con el JLS:¿Por qué todas las clases anónimas son implícitamente finales?
15.9.5 Declaraciones Una declaración de la clase anónima clase anónima se deriva automáticamente de una expresión creación de la instancia de clase por el compilador.
Una clase anónima nunca es abstracta (§8.1.1.1). Una clase anónima es siempre una clase interna (§8.1.3); nunca es estático (§8.1.1, §8.5.2). Una clase anónima siempre es implícitamente final (§8.1.1.2).
Parece que fue una decisión de diseño específica, por lo que es probable que tenga algo de historia.
Si elige tener una clase como esta:
SomeType foo = new SomeType() {
@Override
void foo() {
super.foo();
System.out.println("Hello, world!");
}
};
¿Por qué no se me permite hacerla una subclase de nuevo si así lo deseo?
SomeType foo = new SomeType() {
@Override
void foo() {
super.foo();
System.out.println("Hello, world!");
}
} {
@Override
void foo() {
System.out.println("Hahaha, no super foo for you!");
}
};
No estoy diciendo que necesariamente quiero, o incluso puedo pensar en una razón por la que lo haría. Pero tengo curiosidad de por qué este es el caso.
¿Tomaría "la sintaxis no lo permite"? ;-) Esa podría ser la razón por la que dijeron "_implicitly_ final" ... solo adivinar. –
cuando se compilan, no son anónimos ni privados. Sin embargo, todavía contienen metadatos y hacerlos definitivos no garantiza que existan casos súper raros (ampliándolos) – bestsss
@David, también hay una razón técnica – bestsss