2010-04-07 8 views
30

trato de convertir un objeto a mi clase de acción, pero el resultado es una advertencia:de seguridad Tipo: Desactivada fundido del objeto

Type safety: Unchecked cast from Object to Action<ClientInterface> 

Action<ClientInterface> action = null; 
try { 
Object o = c.newInstance(); 
if (o instanceof Action<?>) { 
    action = (Action<ClientInterface>) o; 
} else { 
    // TODO 2 Auto-generated catch block 
    throw new InstantiationException(); 
} 
[...] 

Gracias por cualquier ayuda

+0

¿Cuál es el tipo de 'c'? – meriton

+0

Con respecto al tipo de c: Clase c = nulo; c = Class.forName (className); De todos modos, ¡tuve suficientes respuestas claras! Gracias a todos, ¿es posible cerrar de alguna manera la pregunta o marcarla como respondida? – Matthew

+0

Sí, use la marca de verificación verde a la izquierda de su respuesta preferida. – meriton

Respuesta

53

Sí - este es un producto natural consecuencia de type erasure. Si o es realmente una instancia de Action<String> que no será capturada por el reparto, solo verá el problema cuando intente usarlo, pasando un ClientInterface en lugar de una cadena.

usted puede deshacerse de la advertencia usando:

@SuppressWarnings("unchecked") 

como una función de anotación, pero no se puede fácilmente resolver el problema subyacente :(

1

No se preocupe de lo que es. porque el compilador de Java no tiene manera de saber cuál es el tipo real del objeto.

1

Ha perdido la información del tipo debido a la eliminación (es decir, los tipos de parámetros han sido borrados), de ahí la advertencia. No hagas nada al respecto, salvo limpiar el código que lo rodea que los genéricos se utilizan con más frecuencia, por lo que puede pasar la información de tipo genérico y evitar el lanzamiento de nada.

5

La advertencia significa que el compilador no puede garantizar la seguridad del tipo incluso si la conversión funciona bien en el tiempo de ejecución. Debido a la eliminación, en el tiempo de ejecución el casting es simplemente un lanzamiento a Action. Es posible que la clase genérica subyacente no sea del tipo ClientInterface como se esperaba. En este caso, el problema aparecerá más tarde (tal vez incluso mucho más tarde), como una ClassCastException.

En este caso específico, le recomiendo que suprimir la advertencia expresa de la siguiente directiva del compilador:

@SuppressWarnings("unchecked") 
14

Como de costumbre, Jon Skeet es correcto.

dar más detalles sobre la parte no-facilidad de su respuesta:

Dado

class ClientAction implements Action<ClientInterface> {} 

Se puede escribir:

Class<? extends Action<ClientInterface>> c = ClientAction.class; 
Action<ClientInterface> action = c.newInstance(); 

Esto elimina tanto el reparto y la advertencia, en el precio de introducir un tipo no genérico para que pueda usar .class para obtener un objeto Class suficientemente tipado con precisión.

+0

ClientAction.class ???? de donde viene –

Cuestiones relacionadas