Código¿Es una interfaz miembro en una declaración de clase implícitamente pública?
Tengo el siguiente clase con una interfaz de usuario:
package com.example.withinterface;
public class SomeClass {
interface SomeInterface {
void doSomething();
}
}
Y otra clase tratando de acceder a ella:
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
En Principal Recibo el siguiente error de javac: SomeInterface is not public in SomeClass; cannot be accessed from outside package
.
Y en Eclipse: SomeInterface is not public in SomeClass; cannot be accessed from outside package
.
Ambos compilados como Java 7. Todo compila bien si hago SomeInterface public
.
Pero Spec dice
El Java Language Specification for Java 7 dice esto:
Una interfaz es una interfaz miembro de cuya declaración está directamente encerrado en otra clase o interfaz de declaración.
Una interfaz miembro en una declaración de clase es implícitamente pública (§6.6) a menos que se especifique un modificador de acceso.
El Java Language Specification for Java 5 no parece tener la segunda oración.
Pregunta
lo tanto no debe ser considerado SomeInterface público y no debería compilar principal?
actualización
Como sugiere Ajay George esto fue hecho an error in the Java Language Specification 7 (gracias JamesB). Mientras tanto, se corrigió la especificación y se eliminó la oración incorrecta. Last version in Archive.org with the incorrect sentence.
Huh. Siempre asumí que todo estaba protegido por paquetes a menos que se indique lo contrario. Supongo que aprendí algo nuevo. –
Creo que esto se debe a que los usuarios que no tienen un modificador de acceso tienen acceso a paquetes. Entonces no pueden ser utilizados por otros paquetes –
@Desolator ¿Leyó la pregunta? Las interfaces de los miembros son ** públicas por defecto **. –