O
olafmat1
According to the Java Language Specification 3.0: "A nested class is
any class whose declaration occurs within the body of another class or
interface." (top of the "8. Classes" chapter), and (§8.1.3) "An inner
class is a nested class that is not explicitly or implicitly declared
static. Inner classes may not declare static initializers (§8.7) or
member interfaces. Inner classes may not declare static members,
unless they are compile-time constant fields (§15.28)."
But JDK compiler seems to use a different rule for inner classes –
inner class seems to be a non-static class DIRECTLY enclosed by
another class.
For example the following code is invalid according to JLS, but JDK
accepts it:
class A {
interface B {
class C { //It's an inner class, isn't it?
static int v; //Static variable
static {} //Static initializer
static void x() {} //Static method
interface D {} //Interface
}
}
}
@interface can separate classes as well, making them "not-inner
classes".
In the following code, class C has been finally recognized as an inner
class:
interface A {
class B { //Class B directly encloses C
class C {
static int v; //No error???
static {} //Error
static void x() {} //Error
interface D {} //Error
}
}
}
Tested on javac version 1.6.0_10-rc
Is it a bug, or did I miss something?
BTW, I don't understand why use of static members is limited at all.
Best,
Olaf Matyja
any class whose declaration occurs within the body of another class or
interface." (top of the "8. Classes" chapter), and (§8.1.3) "An inner
class is a nested class that is not explicitly or implicitly declared
static. Inner classes may not declare static initializers (§8.7) or
member interfaces. Inner classes may not declare static members,
unless they are compile-time constant fields (§15.28)."
But JDK compiler seems to use a different rule for inner classes –
inner class seems to be a non-static class DIRECTLY enclosed by
another class.
For example the following code is invalid according to JLS, but JDK
accepts it:
class A {
interface B {
class C { //It's an inner class, isn't it?
static int v; //Static variable
static {} //Static initializer
static void x() {} //Static method
interface D {} //Interface
}
}
}
@interface can separate classes as well, making them "not-inner
classes".
In the following code, class C has been finally recognized as an inner
class:
interface A {
class B { //Class B directly encloses C
class C {
static int v; //No error???
static {} //Error
static void x() {} //Error
interface D {} //Error
}
}
}
Tested on javac version 1.6.0_10-rc
Is it a bug, or did I miss something?
BTW, I don't understand why use of static members is limited at all.
Best,
Olaf Matyja