java generics compiler-errors javac

javac error: ¿tipos inconvertibles con genéricos?



generics compiler-errors (4)

No sé por qué está sucediendo, pero una solución es fácil:

@Override public <E extends Enum<E>> void postEvent( Context context, E code, Object additionalData) { Object tmp = code; if (tmp instanceof LogEvent.Type) { LogEvent.Type scode = (LogEvent.Type)tmp; ...

Es feo, pero funciona ...

Hay varias otras preguntas de SO que hablan sobre los genéricos que compilan OK con el compilador de Eclipse pero no javac (es decir, Java: los genéricos se manejan de manera diferente en Eclipse y javac y Generics compila y ejecuta en Eclipse, pero no se compila en javac ). Como uno ligeramente diferente.

Tengo una clase de enum :

public class LogEvent { public enum Type { // ... values here ... } ... }

y tengo otra clase con un método que toma objetos arbitrarios de tipos descendientes de Enum :

@Override public <E extends Enum<E>> void postEvent( Context context, E code, Object additionalData) { if (code instanceof LogEvent.Type) { LogEvent.Type scode = (LogEvent.Type)code; ...

Esto funciona bien en Eclipse, pero cuando hago una compilación construida con ant , obtengo un par de errores, uno en la línea de instanceof y el otro en la línea de lanzamiento:

443: inconvertible types [javac] found : E [javac] required: mypackage.LogEvent.Type [javac] if (code instanceof LogEvent.Type) [javac] ^ 445: inconvertible types [javac] found : E [javac] required: com.dekaresearch.tools.espdf.LogEvent.Type [javac] LogEvent.Type scode = (LogEvent.Type)code; [javac] ^

¿Por qué sucede esto y cómo puedo solucionar este problema para que se compile correctamente?


Para utilizar instanceof ambos operandos tienen que heredar / implementar la misma clase / interfaz.
E simplemente no se puede convertir a LogEvent.Type

No sé cómo se ve tu método completo, pero esto debería resolver tu problema usando interfaces y no Genéricos.

public interface EventType { } public class LogEvent { public enum Type implements EventType {} } public void postEvent(Context context, EventType code, Object additionalData) { if(code instanceof LogEvent.Type) { } }


Quizás sea porque has declarado E como algo que extiende Enum <E>. No puedo decir que lo entiendo completamente, pero parece que limita el conjunto de tipos a algún subconjunto que no puede incluir LogEvent.Type por algún motivo. O tal vez es sólo un error en el compilador. Estaría feliz si alguien pudiera explicarlo más claramente, pero esto es lo que puedes hacer:

public <E extends Enum<?>> void postEvent(E code) { if (code instanceof LogEvent.Type) { LogEvent.Type scode = (LogEvent.Type)code; ... } ...

Esto funciona y es más elegante que simplemente lanzar a un objeto.


Tuve un problema similar y actualicé de jdk1.6.0_16 a jdk1.6.0_23 y se fue sin ningún cambio de código.