2013-08-05 8 views
9

Nie mogę zrozumieć, dlaczego to nie działa. Moje zajęcia na najwyższym poziomie znajdują się w nienazwanych pakietach (na razie planuję później skonfigurować pakiety).Próbujesz zaimportować typy zagnieżdżone z klasy

Iclass1.java:

public class Iclass1 {  
    public static class Nested1 { 
     // whatever 
    }  
} 

Iclass2.java:

import Iclass1.*; 
public class Iclass2 { 
    private Nested1 someMember; 
    // etc. 
} 

Po kompilacji Iclass1.java bez błędów, kompilator narzeka kiedy skompilować Iclass2.java: „Błąd: Pakiet Iclass1 nie istnieje ".

Ale JLS mówi: (7.5.2)

import PackageOrTypeName . * ; 

The PackageOrTypeName must be the canonical name (§6.7) of a package, a class type, an interface type, an enum type, or an annotation type.

oraz: (6,7)

The fully qualified name of a top level class or top level interface that is declared in an unnamed package is the simple name of the class or interface.

For every primitive type, named package, top level class, and top level interface, the canonical name is the same as the fully qualified name.

więc wydaje się Iclass1 jest kanoniczna nazwa typu I” m próbuje użyć w import. Co ja robię źle?

(PS: I teraz myślę import static byłby lepszy, ale to nie działa albo.)

+0

ale - nad wszystkim - co jest właściwą odpowiedzią? –

+0

Sajal's teraz redagowana odpowiedź odpowiednio odpowiada na pytanie. Inne odpowiedzi były błędne (sugerowane rozwiązania nie działają) lub nieprzydatne (po prostu mówią "nie rób tego") lub oba. –

Odpowiedz

9

Skoro masz żadnych pakietów, nie używać importu.

Ponieważ JLS §7.5 powie nie:

A type in an unnamed package (§7.4.2) has no canonical name, so the requirement for a canonical name in every kind of import declaration implies that (a) types in an unnamed package cannot be imported, and (b) static members of types in an unnamed package cannot be imported. As such, §7.5.1, §7.5.2, §7.5.3, and §7.5.4 all require a compile-time error on any attempt to import a type (or static member thereof) in an unnamed package.

+0

Hmmm ... Fragment, który cytujesz z JLS, jest pisany kursywą, co zdaje się wskazywać, że nie ma to być "reguła", lecz raczej tekst objaśniający, wyjaśniający konsekwencje reguł. Ale wydaje się to sprzeczne z regułami w punkcie 6.7, co oznacza, że ​​typ w nienazwanym pakiecie * ma * nazwę kanoniczną i nie dodaje żadnych reguł, które mówią, że ten przypadek jest wyjątkiem. Wydaje się, że czegoś brakuje. W każdym razie, dziękuję za skierowanie mnie do tej "reguły", ponieważ naturalnie nie wyglądało to na regułę, więc nie mogłem jej znaleźć. – ajb

+0

@ajb Myślę, że im też było trudno to wyjaśnić. :) 6.7 zaczyna się od "... Każdy typ pierwotny, nazwany pakiet, klasa najwyższego poziomu i interfejs najwyższego poziomu ma w pełni kwalifikowaną nazwę:". Uwaga "nazwany pakiet". –

+0

Ale czy moje zajęcia nie są tutaj "klasami najwyższego poziomu"? – ajb

-3

Jeśli chcesz zrobić import więc można zadeklarować członek prywatnego w Iclass2 jak private Nested1 someMember;, nie robiąc Iclass1.Nested1 trzeba mieć Iclass1 w pakiecie.

Gdy masz go w opakowaniu, można importować zagnieżdżonych członków tak:

import mypackage.Iclass1.Nested1; 
import mypackage.Iclass1.*; 
import static mypackage.Iclass1.Nested1; 
import static mypackage.Iclass1.*; 

Nie można niczego od domyślnej przestrzeni nazw/pakiet importować.

+0

Żadne z tych elementów nie działa. –

+1

Downvotes są, ponieważ ta odpowiedź nie jest poprawna. Po prostu nie można importować z nienazwanego pakietu. –

0

To bardzo niespójne z Java, ale wydaje się, że nie można importować klas wewnętrznych, jeśli klasa kontenera najwyższego poziomu znajduje się w domyślnym pakiecie.

Jeśli umieścisz dwie klasy w dowolnym pakiecie, importowanie działa poprawnie.

Spróbuj utworzyć katalog dla tych dwóch klas o nazwie foo, przenosząc je tam, a następnie dodając package foo; jako pierwszą linię w każdym pliku.

+1

Nie sądzę, że próbuje rozwiązać problem, myślę, że próbuje go zrozumieć. – keyser

Powiązane problemy