2014-01-31 9 views
5

JLS: Chapter 7. Packages:Reihenfolge der automatisch importierten Paketen und Mehrdeutigkeit

Ein Paket besteht aus einer Anzahl von Übersetzungseinheiten (§ 7.3). Eine Kompilierungseinheit hat automatisch Zugriff auf alle in ihrem Paket deklarierten Typen und importiert automatisch alle öffentlichen Typen, die im vordefinierten Paket java.lang deklariert sind.

Hier können Sie den folgenden Code annehmen:

package com.example.p1; 
public class MyClass { } 
package com.example; 
public class MyClass { } 
package com.example; 
public class String { } 
package com.example; 

import com.example.p1.*; 

public class MainNameClash { 
    private String s; // No Error, even though ambiguous with java.lang.String! 
    private MyClass m; // No error, even though ambiguous with com.example.p1.MyClass! 
} 

Wenn ich MyClass von com.example inbewegenund importieren Sie es mit import com.example.p2.*, ich bekomme Error: the type MyClass is ambigious an der Stelle, wo es verwendet wird.

Es scheint, dass die Typen aus dem Paket selbst immer Vorrang vor allen anderen importierten Typen haben, sei es automatisch von java.lang oder explizit mit einem Platzhalterimport, und dass der Compiler keine Warnung oder Fehler ausgibt.

Frage:

  • Warum wird der Java-Compiler keine Zweideutigkeit Fehler in diesem Fall emittieren?
  • Wo in der JLS ist dieses Verhalten definiert?

Antwort

7

Die Import-Anweisungen der Form:

import packageName.subPackage.* 

ist Type-Import-on-Demand Declarations. Das heißt, die Klassen oder irgendwelche Typen von ihnen werden nur importiert, wenn dieser Typ nicht im Bereich der aktuellen Kompilierungseinheit verfügbar ist.

Von Beispiel 7.5.2-1 dieser JLS Abschnitt nur:

Die Erklärung könnte durch eine sorten-Einfuhranmeldung von einer Art, deren einfacher Name ist Vector beschattet werden; von einem Typ namens Vector und in dem Paket deklariert, zu dem die Kompilierungseinheit gehört; oder irgendwelche verschachtelten Klassen oder Schnittstellen.

Also, wenn Sie eine Klasse String im selben Paket wie die Klasse haben, dann String in dieser Klasse verwenden, wird Ihre Klasse beziehen, wie java.lang.String wird nicht importiert. Es wird nur auf Nachfrage importiert werden, wie in example 6.4.1-2 von JLS § 6.4.1 - Shadowing gezeigt.

0

Eigentlich ist die Frage über einfache Typnamen:

6.5.5.1Simple Type Names Wenn ein Typname eines einzelnen Identifier besteht, dann muss die Kennung im Rahmen von genau einem sichtbar auftreten Deklaration eines Typs mit diesem

Über Umfang können wir hier lesen:

(6.3) Der Umfang einer Erklärung ist die Region des Programms, in dem das Unternehmen durch die Erklärung erklärt kann auf die Verwendung eines einfachen Namen bezeichnet werden, sofern es

sichtbar ist ..

der Umfang eines Typ von einer Einzeltyp-Einfuhranmeldung importiert (§7.5.1) oder eine Typ-Import-on-Demand-Deklaration (§ 7.5.2) ist die ganze Klasse und Interface Geben Sie d ein eclarations (§7.6) in der Kompilationseinheit , in der die Importdeklaration erscheint, sowie eventuelle Anmerkungen zur Paketdeklaration (falls vorhanden) der Kompilierungseinheit.