una que multiple interfaz interfaces implementacion herencia entre diferencia codigo clases clase abstractas abstracta java inheritance dependencies cyclic

que - interfaces en java



¿Por qué Java prohíbe la herencia de interfaces internas? (3)

¿Por qué la siguiente "dependencia cíclica" no es posible?

public class Something implements Behavior { public interface Behavior { // ... } }

Como las interfaces no hacen referencia a la clase externa, esto debería permitirse; sin embargo, el compilador me obliga a definir esas interfaces fuera de la clase. ¿Hay alguna explicación lógica para este comportamiento?


El simple hecho de que las especificaciones del lenguaje lo prohíben debería ser suficiente.

Algunas razones que podría pensar:

  • No sería útil.

  • Por los motivos que quiera usar, estoy seguro de que existen mejores opciones.

  • Las clases secundarias deberían extender las clases base, entonces, ¿por qué declararías una clase base dentro de su propio hijo?

  • Sería contra-intuitivo tener una clase separada para extender tu clase interna.


Imagina que eres el compilador.

Te estamos diciendo que crees una clase Algo. Esta clase implementa Comportamiento ... Pero el Comportamiento aún no existe porque Algo no está registrado ...

¿Entiendes el problema?

Ver clase como caja que contiene cosas. El comportamiento está contenido en la caja Algo. Pero algo no existe.


Reglas relevantes en la especificación:

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4

Una clase C depende directamente de un tipo T si T se menciona en la cláusula extends o implementa de C, ya sea como superclase o superinterfaz, o como calificador de una superclase o nombre de superinterfaz.

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3

Una interfaz I depende directamente de un tipo T si T se menciona en la cláusula extends de I, ya sea como una superinterfaz o como un calificador dentro de un nombre de superinterfaz.

Por lo tanto, si A extends|implements BC , A depende de C y B Spec luego prohíbe las dependencias circulares.

La motivación de incluir B en la dependencia no está clara. Como mencionaste, si BC se promociona al nivel superior C2 , no hay mucho diferente en lo que respecta al sistema de tipo, entonces ¿por qué A extends C2 está bien, pero no A extends BC ? Concedido un tipo anidado BC tiene algún acceso privilegiado al contenido de B , pero no puedo encontrar nada en la especificación que hace que A extends BC .

El único problema es cuando C es una clase interna. Supongamos que B=A , A extends AC debe estar prohibida, porque hay una dependencia circular de "instancia adjunta". Esa es probablemente la verdadera motivación: prohibir que la clase exterior herede la clase interna. Las reglas reales son más generalizadas, porque son más simples y tienen sentido de todos modos, incluso para las clases no internas.