Betrachten Sie den folgenden Code ein:Warum können Sie eine Klasse mit demselben Namen wie eine geschachtelte Klasse importieren?
import java.util.Calendar;
class Demo
{
class Calendar {}
public static void main (String[] args) {
// System.out.println(Calendar.DAY_OF_WEEK); // Would be an error.
}
}
Dieser Code kompiliert fein; aber wenn Sie sich auf Calendar
innerhalb Demo
beziehen, beziehen Sie sich auf Demo.Calendar
, nicht java.util.Calendar
.
Der Import ist eindeutig redundant; aber es scheint seltsam, dass es erlaubt ist, wenn man bedenkt Sie nicht eine Klasse mit dem gleichen einfachen Namen als Top-Level-Klasse in derselben Übersetzungseinheit (pro JLS Sec 7.5.1) definiert zu importieren erlaubt:
import java.util.Calendar; // error: Calendar is already defined in this compilation unit
class Calendar {}
Gibt es Ein praktischer Grund, warum ein solcher Import wie im ersten Codebeispiel kein Kompilierungsfehler wäre?
Es ist nicht redundant; es ist unwirksam. Mit dem gesagt, ich bin ziemlich sicher, dass dies legal ist, nur weil die Sprachspezifikation es nicht verbietet. Wahrscheinlich ist es ein Fall, der von den Sprachdesignern nicht berücksichtigt wird. – davmac
Sie haben die JLS falsch gelesen. Es verbietet nicht, einen Namen zu importieren, der einer Klasse der obersten Ebene entspricht, es verbietet das Importieren eines Namens "n", wenn "die Kompilierungseinheit auch einen Typ auf oberster Ebene [sic] deklariert, dessen einfacher Name" n "ist. Das ist nicht die Situation, die du zeigst. –
@LewBloch Ich verstehe den Unterschied, auf den Sie hinweisen, nicht. Kannst du bitte ein Beispiel geben, um die Unterscheidung zu demonstrieren? –