Java – does the member interface in the class declaration imply public?
code
I have a class with a member interface:
package com.example.withinterface; public class SomeClass { interface SomeInterface { void doSomething(); } }
Another tried to access its course:
package com.example.withinterface.main; import com.example.withinterface.someClass; public class Main { public static void main(String[] argss) { System.out.println(SomeClass.someInterface.class); } }
error
In main, I get the following error from javac: someinterface in someclass is not public; Cannot be accessed from the outer wrapper
In Eclipse: someinterface is not public in someclass; Cannot be accessed from the outer wrapper
Both are compiled into Java 7 If I expose someinterface, all the compilation is good
But the specifications say
The Java language specification for Java 7 says:
There seems to be no second sentence in the Java language specification for Java 5
topic
So someinterface should not be considered public and should not be mainly compiled?
to update
As Ajay George shows, this is indeed an error in the Java language specification 7 (thanks to James B) At the same time, the specification is modified and the wrong sentence is deleted Last version in Archive. org with the incorrect sentence.
Solution
I guess this specification is wrong
E:\workspace>javap com\example\withinterface\SomeClass Warning: Binary file com\example\withinterface\SomeClass contains com.example.wi thinterface.someClass Compiled from "SomeClass.java" public class com.example.withinterface.someClass { public com.example.withinterface.someClass(); } E:\workspace>javap com\example\withinterface\SomeClass$SomeInterface Warning: Binary file com\example\withinterface\SomeClass$SomeInterface contains com.example.withinterface.someClass$SomeInterface Compiled from "SomeClass.java" interface com.example.withinterface.someClass$SomeInterface { public abstract void doSomething(); }
I changed the interface to public and recompiled it
E:\workspace>javap com\example\withinterface\SomeClass Warning: Binary file com\example\withinterface\SomeClass contains com.example.wi thinterface.someClass Compiled from "SomeClass.java" public class com.example.withinterface.someClass { public com.example.withinterface.someClass(); } E:\workspace>javap com\example\withinterface\SomeClass$SomeInterface Warning: Binary file com\example\withinterface\SomeClass$SomeInterface contains com.example.withinterface.someClass$SomeInterface Compiled from "SomeClass.java" public interface com.example.withinterface.someClass$SomeInterface { public abstract void doSomething(); }
Pay attention to the differences of inner classes