2013-05-16 22 views
5

Mam klasy A ze statycznym klasy wewnętrznej w środku o nazwie B:Nie można zaimportować statycznej klasy wewnętrznej statycznej?

import static A.B.*; 

class A { 
    static class B { 
     static int x; 
     static int y; 
    } 
    public static void main(String[] args) { 
     System.out.println(x); 
    } 
} 

Chcę statycznej importu wszystkiego w B, ale to przyzwyczajenie praca:

$ javac A.java 
A.java:1: package A does not exist 
import static A.B.*; 
      ^
A.java:9: cannot find symbol 
symbol : variable x 
location: class A 
     System.out.println(x); 
         ^
2 errors 

Dlaczego?

Odpowiedz

9

To nie zadziała, jeśli A znajduje się w domyślnym pakiecie. Jednakże można dodać deklarację pakiet:

package mypackage; 

i używać

import static mypackage.A.B.*; 

Statyczny import składnia od od JLS podano:

SingleStaticImportDeclaration: import static TypeName . Identyfikator;

gdzie wymagana jest TypeName być full qualified.

W Using Package Members składnia static import jest podany z nazwy pakietu wliczone:

import static mypackage.MyConstants.*; 

It is recommended używać static importu bardzo oszczędnie.

+1

"To nie zadziała, jeśli A jest w domyślnym pakiecie." Co. Czemu? – Dog

+0

Z JLS wydaje się, że klasa TypeName musi być w pełni kwalifikowana. Sądząc po tym, kompilator wymaga obecności konwencji nazwy pakietu, prawdopodobnie w celu uniknięcia niejednoznaczności użycia klasy – Reimeus

1

Powinno być

import <the-package-for-the-class-A>.A.B.*; 

Jeżeli A jest w domyślnym pakietem, to nie.

Wreszcie, nie jest dobrą praktyką importowanie *. Wystarczy zaimportować tylko te rzeczy, których potrzebujesz, w tym przypadku - import static <the-package-for-the-class-A>.A.B.x;, jeśli chcesz użyć tylko zmiennej x.

+0

"nie jest dobrą praktyką do importowania *" Nawet jeśli pochodzi z tego samego pliku? – Dog

+0

Tak, nie ma sensu mieć niewykorzystanego importu. –

+0

co? Używam importu, inaczej nie zadaję tego pytania – Dog

Powiązane problemy