alle corrispondenti specifiche:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4
Una classe C dipende direttamente un tipo T se T è menzionato nella estende o implementa clausola C sia come superclasse o superinterfaccia o come qualificatore di un nome superclasse o superinterfaccia.
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3
Un'interfaccia I dipende direttamente su un tipo T se T è menzionato nel estende clausola che sia come superinterfaccia o come qualificazione di un nome superinterfaccia.
Pertanto se A extends|implements B.C
, A dipende sia C
e B
. Spec quindi proibisce le dipendenze circolari.
La motivazione di includere B
nella dipendenza non è chiara. Come hai detto, se il livello B.C
viene promosso al primo livello C2
, non molto è diverso per quanto riguarda il sistema di tipi, quindi perché A extends C2
è ok, ma non A extends B.C
?Concesso un tipo nidificato B.C
ha qualche accesso al contenuto di B
, ma non riesco a trovare nulla nelle specifiche che rende problematico lo A extends B.C
.
L'unico problema è quando C
è una classe interna. Supponiamo che B=A
, A extends A.C
sia vietato, perché esiste una dipendenza circolare di "istanza che include". Questa è probabilmente la vera motivazione: proibire alle classi esterne di ereditare la classe interiore. Le regole attuali sono più generalizzate, perché sono più semplici e hanno comunque un senso anche per le classi non interne.
Sembra che il classloader debba prima leggere la classe per conoscere l'interfaccia di cui ha bisogno per definire la classe in primo luogo ... Non conosco i dettagli del caricamento delle classi, ma sembra abbastanza ovvio. –
@donneo: poiché il compilatore si lamenta di una "dipendenza ciclica", immagino che sappia già quali tipi sono definiti nella classe interna. Mi sembra una restrizione arbitraria. –
@PhilipK: quale compilatore stai usando? I miei (Oracle JDK 6 e 7) si lamentano solo di "non trovare il simbolo". A parte questo: una buona domanda, dal momento che un'interfaccia annidata non si affida * * in modo tecnico alla classe esterna, questo * potrebbe * essere legale. –