2016-09-12 2 views
0

Dies erlaubt ist:Java Outer-Klasse erweitert statische innere Klasse

public class Outer { 
    public static class Inner extends Outer { } 
} 

aber das ist nicht:

public class Outer extends Inner { 
    public static class Inner { } 
} 

Im zweiten Fall der Compiler von Cyclic inheritance involving package.Outer beschwert. Ich sehe keine Zyklen; Warum ist der zweite Fall nicht gültig?

Dies verhält sich gleich ob Inneres class, abstract class oder interface ist.

Der Anwendungsfall ist für eine rekursive Datenstruktur - ein Symbol-Namespace. Grundsätzlich möchte ich die Benennungsstruktur von Namespace extends Namespace.Member, MyDataChunk extends Namespace.Member; jeder Namespace würde sich wie eine Karte von String bis Namespace.Member verhalten, was es ermöglicht, mehrere Ebenen von Namespace, die mit einer MyDataChunk enden, zu rekursiv zu machen.

+0

Sie sehen keine Zyklen, dies ist jedoch für eine rekursive Datenstruktur. Dies scheint zu widersprechen. Siehe auch http://stackoverflow.com/questions/33918022/cyclic-inheritance-and-interfaces-class-a-cant-implement-class-b-interface-wh – Tunaki

+0

@Tunaki Wenn ich es richtig lese, Die Typen sollte nicht Radfahren sein; die tatsächliche Rekursion ist noch nicht einmal in einem Member von 'Map '). – CAD97

+0

@Tunaki Zyklische Vererbung ist 'A erweitert B' und' B erweitert A', und eine rekursive Datenstruktur ist 'A {member A}'. Zum obigen Code sollte keiner vorhanden sein, wenn ich richtig lese, obwohl sich der Compiler über Ersteres beschwert. – CAD97

Antwort

4

Ich sehe nicht irgendwelche Zyklen

beteiligt

Ich: Outer nicht Outer.Inner verlängern kann, wenn sie nicht existiert. Damit Outer.Inner existiert, muss Outer existieren. Es ist eine Catch-22, eine zyklische Abhängigkeit.

+1

Dies wird noch offensichtlicher, wenn wir die verschachtelte Klasse als 'Membertyp' bezeichnen, wie es [JLS] tut (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html# jls-8.1.6). – biziclop

+1

Das macht Sinn; Ich dachte, es würde sich nicht so verhalten mit 'statisch'. Darum habe ich gefragt! – CAD97

Verwandte Themen