Pregunta

Trato de convertir un objeto a mi clase de acción, pero el resultado es una advertencia:

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

¿Fue útil?

Solución

Sí - esto es una consecuencia natural de tipo borrado . Si o es en realidad una instancia de Action<String> que no será atrapado por el elenco -. Sólo verá el problema al intentar usarlo, pasa en un ClientInterface 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: (

Otros consejos

Como de costumbre, Jon Skeet es correcta.

Para 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, al precio de la introducción de un tipo no genérico para que pueda utilizar .class para obtener un objeto Class suficientemente escrito con precisión.

Los medios de advertencia de que el compilador no puede garantizar la seguridad de tipos, incluso si el casting funciona bien en tiempo de ejecución. Debido a la cancelación, en tiempo de ejecución el casting es simplemente una pieza de fundición a la acción. Es posible que la clase genérica subyacente no es de tipo clientInterface como se esperaba. En este caso, el problema aparecerá más adelante (tal vez incluso mucho más tarde), como ClassCastException.

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

@SuppressWarnings("unchecked")

No se preocupe por. Es debido a que el compilador Java no tiene manera de saber, ¿cuál es el tipo real del objeto.

Usted ha perdido la información de tipo a causa de borrado (es decir, los tipos parametrizados se han borrado), de ahí la advertencia. No se puede hacer nada al respecto, aparte de limpiar el código que rodea por lo que los genéricos se utilizan con más frecuencia, por lo que puede pasar la información de tipo genérico y la colada evitar en absoluto.

Este es un abatido. Es el elenco dinámico en el que el compilador no tiene ni idea del objeto real de la referencia está apuntando.

Se obtiene esta advertencia debido a que el tipo de destino del Action<ClientInterface> fundido es un tipo parametrizado y el compilador no puede garantizar que el objeto de ser fundido tipo es del mismo tipo.

Si no desea suprimir esta advertencia y no se preocupan por el parámetro de tipo, que podría cambiar el código para esto mediante el uso de comodines:

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

Esto es mucho más seguro porque el instanceof no puede comprobar que o es un objeto de Action<ClientInterface>, simplemente comprobar si o es un objeto de Action ya más información de tipo genérico será Erased en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top