2012-03-07 6 views
11

Eclipse Indigo, java 1,6Eclipse ama, odia javac, que es una enumeración, más o menos, con una interfaz

public interface I { 
    String getName(); 
} 

/* and in another file */ 

public enum E implements I { 
    E1() { 
    String getName() { return "foo"; } 
    }; 
} 

En Eclipse, esto funcionó! Otras clases podrían invocar a getName() en las referencias de tipo I. El javac real lo rechazó, alegando que no había tal cosa como getName() en la enumeración. ¿Es esto solo un error de Eclipse?

Tenga en cuenta que lo que es extraño acerca de esto es la definición de método dentro del enumerador. Todo funciona bien tanto en Eclipse como en Javac si hago lo normal y la función definida en la parte inferior de la enumeración devuelve el valor de un campo.

+1

Debe permitirse. Esta pregunta está relacionada: http://stackoverflow.com/questions/2709593/why-would-an-enum-implement-an-interface ¿Qué error de 'javac' estás recibiendo? –

+0

+1 para el título. :-) –

+2

También relacionado con http://stackoverflow.com/questions/9505857/workaround-for-javac-compilation-order-bug-in-maven – Nicocube

Respuesta

1

Primero, estoy de acuerdo con @yshavit.

De lo contrario, puede estar relacionado con éste: Workaround for javac compilation order bug in maven

Creo que es orden de los nombres relacionados. Intenta cambiar el nombre de tu interfaz A, puede compilar primero y las cosas deberían funcionar.

12

getName() en E1 debería ser public - ¿eso es lo que le causa problemas? De lo contrario, intentas anular un método público (todos los métodos declarados en las interfaces son públicos) con un método privado de paquete, que no está permitido.

1

Los métodos de las interfaces son public scoped. Aumente el nivel de visibilidad en su enumeración y compile con éxito. Como nota al margen, su código muestra un error de compilación en mi versión de Eclipse (Indigo se ejecuta en Mac 0S X 10.7.2, JDK 1.6).

0

Tenga en cuenta que Eclipse implementa su propio analizador y compilador, que proporciona una salida que se une estrechamente a su editor. Normalmente, funciona muy bien; sin embargo, cuando entra en juego una nueva característica de idioma, el compilador tiende a retrasarse en la implementación de la nueva función de idioma.

La línea de comandos javac es (casi) siempre correcta, suponiendo que obtiene su javac de Oracle/SUN.

La respuesta de yshavit es la mejor, ya que identifica la razón por la cual no debe compilarse en Eclipse. Por ahora, me imagino que se ha corregido (y no se compilará correctamente en Eclipse).

Cuestiones relacionadas