Martin Jung: TextValuePair cannot resolved

Beitrag lesen

Hi Slyh,

Nested Classes müssen natürlich nicht in einer eigenen Datei liegen.
Aber da gehört ja die Klasse auch zu einer umschließenden Klasse.
(Ich hoffe, wir verstehen unter "nested classes" dasselbe.)

Ich habe mich da auch länger verwirren lassen ;-))

Spezifikation 8.1.2:
"An inner class is a nested class that is not explicitly or implicitly declared static."

D.h., die statischen "innewohnenden" Klassen sind dann halt "nur" nested Klassen. Hast Du eine passende Übersetzung dafür?

Interessanterweise kommt die Meldung nicht, wenn man das "public"
wegläßt, die Klasse also einen Package-Scope kriegt.

Aus Spezifikation 8:
"A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class."

Also:

public Class A {

public static class B { // nested class
   }
}

public Class A {
}
class B { // top-level class
}

Aus Spezifikation 7.6:
"When packages are stored in a file system (§7.2.1), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

  • The type is referred to by code in other compilation units of the package in which the type is declared.
    ********
  • The type is declared public (and therefore is potentially accessible from code in other packages)."
    ********

Die Fehlermeldung rührt also daher, dass mehr als eine Top-Level Klasse mit dem Access Modifier "public" in der selben Compilation Unit definiert ist, und dies oben zitierter Spezifikation (7.6) widerspricht.
Wenn dem nicht so wäre, hätte der Compiler (bzw. Classloader) vermutlich auch Schwierigkeiten, das einem derart referenzierten Typ entsprechende Source-File zu finden (zumindest auf File-basierten VM-Implementierungen) ;-)

Viele Grüße,
Martin