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.