Static import from default package ?
Dan Smith
daniel.smith at oracle.com
Wed Mar 28 12:38:54 PDT 2012
I looked for some clarification from the spec. I think the problem is that A is not in scope.
- 7.5.4: The static-import name must be a TypeName and it must be a canonical name
- 6.5.5.1: The meaning of an unqualified TypeName is the matching in-scope type declaration, assuming there is exactly one
- 6.3: The scope of a top-level type is "all type declarations" (_not_ all compilation units) in the same package
This odd scoping rule allows imports to get around certain name conflicts between types and packages:
---
package A; public class Foo {}
---
public class A { String Foo = "x"; }
---
import A.Foo;
class Test {
Foo f1; // ok
A.Foo f2; // error: A.Foo is a field, not a type
}
---
I think the JLS's giving a type in an unnamed package a "canonical name" (6.7) is pointless, because you can't use that canonical name in an import due to the scoping rules, and it's not even a unique identifier, since a system can have multiple unnamed packages (7.4.2). So I prefer to explain your example with the (apocryphal) claim that you can't refer to "A" in an import because it doesn't have a canonical name.
—Dan
On Mar 28, 2012, at 8:59 AM, Ulf Zibis wrote:
> Hi all,
>
> is there any reason, why we can't import static from class in default package?
>
> Example:
> class A {
> static final type CONSTANT = 123;
> static final type method() {...};
> }
>
> import static A.*;
> class B {
> static final type HERE = CONSTANT;
> static final type now() { return method(); };
> }
>
> Use case:
> JDK's jtreg tests (based on default package).
>
> Regards,
>
> Ulf
>
>
More information about the compiler-dev
mailing list