2012-01-19 24 views
7

? Hay un montón de preguntas como esta. Revisé la mayoría de ellos pero ninguno realmente pero no pude encontrar ninguna respuesta:¿por qué este código compila con el compilador de eclipse pero no con javac (maven)

Tengo un problema extraño en una de mis clases GWT/GWTP.
La clase compila bien con el compilador Eclipse pero falla con el compilador javac (Maven).

//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 
import com.gwtplatform.mvp.client.View; 

public class MyPresenter extends PresenterWidget<MyPresenter.MyView> { 

    public interface MyView extends View { 


    } 

    some code 
} 

Cuando intento compilar con Maven consigo siguiente error:

cannot find symbol symbol: class View

Ver se refiere a la interfaz View en el paquete com.gwtplatform.mvp.client.

Tengo otras clases que parecen iguales y funcionan bien.
Lo extraño es que si cambio el orden de las importaciones o especifico el paquete exacto de la interfaz View compila sin ningún problema en maven.
Para ser más específicos que se trasladó la importación de com.gwtplatform.mvp.client.View

import com.gwtplatform.mvp.client.View; 
//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 

que tenía un problema similar hace algún tiempo con el problema de la herencia cíclica entre las clases que se refieren a las clases internas (trabajado en Eclipse, pero no lo hicieron en javac). Sin embargo, no estoy seguro si ese es el mismo problema.

+1

No estoy seguro de la causa raíz de sus problemas, pero las interfaces internas no son muy bonitas y pueden llevar a confusiones acerca de dónde provienen sus dependencias. – AndyT

+0

Tienes razón y supongo que mover la interfaz fuera de la clase lo solucionaría (aunque no lo he verificado). Solo tenía curiosidad por saber cuál podría ser la explicación de este extraño comportamiento (desplazarse por las importaciones hace que el código se compile o no) –

Respuesta

8

El compilador de Eclipse es en realidad un compilador diferente que el compilador javac. A veces se separan en comportamiento, por lo general se reconcilian rápidamente.

Esto fue muy notorio cuando salieron los genéricos de Java. Hubo casos en que eclipse encontró fallas en una directiva de genéricos que javac permitiría o javac encontró fallas en los genéricos que el eclipse permitiría (no recuerdo de qué manera se desvió, hace mucho tiempo). En cualquier caso, es más probable que javac sea la implementación correcta.

En su caso, usted contamina el espacio de nombres con su referencia de genéricos a una clase interna. Las probabilidades indican que el eclipse está llegando a la "Vista" en un orden de prioridad diferente que javac. Las probabilidades son excelentes de que Javac implemente el orden tal como se especifica en las directrices del lenguaje Java o que las directrices de Java aún no hayan pronunciado el "único orden verdadero" de resolver clases conflictivas con el mismo nombre. Normalmente esto no es un problema porque no está permitido usar el mismo nombre no calificado en Java dos veces; Sin embargo, con las clases internas, las especificaciones pueden ser "trabajadas".

que haría que la unen

public interface MyView extends View { 


} 

a un solo punto de vista (no sé si com.gwtplatform.mvp.client.View o MyPresenter.View es el correcto), haciendo que el nombre explícito.

public interface MyView extends MyPresenter.View { 


} 

o

public interface MyView extends com.gwtplatform.mvp.client.View { 


} 

De esa manera usted no sean víctimas de la interfaz de "unión" con el tipo equivocado de una manera dependiente del compilador.

+0

Wow. Me quedé atascado en este tema durante la conversión de un proyecto de Java de 'nada-simplemente-golpear-compilar-en-Eclipse' a Maven. El compilador de Java se queja de que falta un símbolo que no falta, por lo que encontrar la causa de este problema es complicado. En referencia a las clases inner-inner de una clase externa como Inner.Inner funciona, pero Inner con una importación para Outer.Inner.Inner solo funciona en Eclipse, no en Maven. Gracias! – JeroenHoek

Cuestiones relacionadas