2015-02-27 11 views
5

Ich habe mehrere Ebenen von inneren Klassen. Das Schlüsselwort extend gilt für die erste Unterebene, nicht aber für die zweite Unterebene. Bedeutung:Java Inner Classes: erweitert Schlüsselwort für mehrere

public class A{ 
     ......... 
    public class B extends A{ 
      .......... 
     public class C extends B{ 
      ........ 
     } 
    } 
} 

Dies gibt mir einen Fehler für public class C extends B{. Dort heißt es:

No enclosing instance of type A is available due to some intermediate constructor invocation.

Warum bin ich diesen Fehler und wie kann ich es beheben? Ich dachte, die Standardkonstruktoren würden damit umgehen.

+3

Sie müssen die B-Klasse statisch machen, um das Problem zu lösen. Gehen Sie durch diese: http://stackoverflow.com/questions/7703812/no-enclosing-instance-of-type-mysuperclassb-is-available-due-to-some-intermedi –

+1

Wie kompilieren Sie diesen Code? Es kompiliert nicht in Eclipse, aber es ist gut mit einfachen 'javac' kompiliert. Beispiel http://ideone.com/LeQ7cx – Pshemo

+0

überprüfen Sie, ob Sie nicht-statische innere Klassen überhaupt brauchen - gute Erklärung [hier] (http://programmers.stackexchange.com/questions/238782/why-prefer-non-static -inner-classes-over-static-one) – harshtuna

Antwort

0

Sie verwenden nicht statische Unterklassen, die Verweise auf äußere Instanzen benötigen. Wenn Sie ihre Nichtstatik nicht benötigen, fügen Sie einfach das Schlüsselwort static zu den Definitionen der inneren Klassen hinzu. Ich bin mir nicht sicher, warum das angegebene Beispiel nicht für Sie funktioniert.

+0

"* Java lässt dich nicht verschachteln *" das ist falsch. Es kompiliert gut, wenn wir Standardcompiler verwenden. Ich vermute, dass OP Eclipse verwendet und sein Compiler hat anscheinend ein Problem damit. Arbeitsbeispiel http://ideone.com/LeQ7cx – Pshemo

+0

@Pshemo Fixed it! – Others

+1

Nicht ganz, deine Antwort beantwortet die Frage nicht wirklich (wie du gesagt hast "Ich bin mir nicht sicher, warum das angegebene Beispiel nicht für dich funktioniert"). Da sein Code gültig ist, bedeutet dies, dass es sich um einen Fehler in der IDE von OP handelt. Daher sind Beiträge ohne Erklärung darüber, was diesen Fehler verursacht und wie er zu beheben ist, keine wirklichen Antworten. Die beste Art von Antwort, die wir jetzt veröffentlichen können, ist "es ist ein Fehler, melden Sie es". – Pshemo

1

Ihr Code ist legal und sollte funktionieren. Die Tatsache, dass Sie den Fehler haben, bedeutet eines der folgenden:

  1. Sie geschrieben haben nicht den gesamten Code
  2. Sie gebrochen/modifizierte jre verwenden.

ich Ihnen Fehler gesucht, die

Kein umschließenden Instanz vom Typ A-Staaten ist verfügbar aufgrund einiger Zwischen Konstruktor Aufruf.

Also ich nehme an, dass einige Konstruktoren in Ihrem Code deklariert sind. Möglicher Grund für Ihren Fehler ist, dass Sie den Konstruktor mit den Parametern für die Klasse A deklariert haben, aber nicht für B und C. Erklärung von spec:

Es ist ein Fehler bei der Kompilierung, wenn ein Standard-Konstruktor implizit ist deklariert, aber die übergeordnete Klasse nicht über einen zugänglichen Konstruktor , die keine Argumente nimmt und hat keine throws-Klausel.


Eine andere Möglichkeit ist, dass Sie bereits A oder B Klasse in Ihrem Paket haben oder Sie haben import ed A oder B Klasse von einem anderen Paket. Der Fehler kann irreführend sein, wenn der Compiler nicht weiß, welche Klasse Sie erweitern.