Esto, de hecho, es una muy buena pregunta si, por ejemplo, necesita poder verificar si dos instancias distintas de una clase Innner
comparten la misma instancia de Outer
clase (== o igual dependiendo del contexto)
yo sugeriría hacer una interfaz de propósito general (no absolutamente necesario para las clases internas nombradas pero puede ser "instancedof"/fundido a):
public interface InnerClass<Outer> {
Outer getOuter();
}
que se puede aplicar a cualquier clase interna llamada .
continuación, hacer algo como:
class MyInnerClass implements InnerClass<Outer> {
Outer getOuter() {
return Outer.this;
}
// remaining implementation details
}
y de esta manera se puede acceder a la clase externa de cualquier clase interna implementar InnerClass<Outer>
interfaz (y comprobar que en realidad lo implementa).
Si su clase interna es anónima, sólo se puede hacer (gracias a Rich MacDonald para su muestra):
new InterfaceOrAbstractClass<Outer>() {
Outer getOuter() { // super inefficient but this is the only way !
return (Outer)getClass().getDeclaredField("this$0");
}
/* other methods */
}
pero InterfaceOrAbstractClass
necesidad implementa InnerClass<Outer>
para poder acceder a la getOuter()
fuera del anonimato cuerpo de clase!
Sería mucho más fácil si javac implementara automáticamente algún tipo de interfaz InnerClass<Outer>
en TODAS las clases internas, y podría hacerlo de manera súper eficiente incluso en clases anónimas (¡sin procesamiento de introspección lento)!
podría explicar el problema que está resolviendo? ¿O es esto académico? –
Académico, principalmente. Lo encontré al encontrar una respuesta a esto: http://stackoverflow.com/questions/763359/validating-instances-of-inner-classes/763504 Di dos respuestas, una haciendo lo que el OP estaba pidiendo usando la misma solución que uso arriba (un método getOuter()). Pero en mi otra respuesta (la que se ha votado a favor) le dije que la diseñara de una manera diferente para que esto no fuera necesario. Pero todavía tenía curiosidad de si era posible hacer esto. – Kip
Su ejemplo proporcionado es la mejor respuesta a esta pregunta. – Pindatjuh