titledborder - set border java
Tipo de seguridad: lanzamiento no verificado de Object (6)
Como de costumbre, Jon Skeet tiene razón.
Para elaborar sobre la parte no fácil de su respuesta:
Dado
class ClientAction implements Action<ClientInterface> {}
Puedes escribir:
Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
Esto elimina tanto el lanzamiento como la advertencia, al precio de introducir un tipo no genérico, por lo que puede usar .class
para obtener un objeto Class
con suficiente precisión.
Intento enviar un objeto a mi clase de Acción, pero da como resultado 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
Este es un abatimiento. Es el molde dinámico donde el compilador no tiene idea del objeto real al que apunta la referencia.
Obtiene esta advertencia porque el tipo de destino de la Action<ClientInterface>
lanzamiento Action<ClientInterface>
es un tipo parametrizado y el compilador no puede garantizar que el objeto que se está fundiendo sea del mismo tipo.
Si no desea suprimir esta advertencia y no le importa el parámetro tipo, puede cambiar el código a este usando 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 la instanceof
no puede verificar que o
es un objeto de la Action<ClientInterface>
, simplemente verifica si o
es un objeto de Action
ya que la información adicional del tipo genérico se borrará en el tiempo de ejecución.
Ha perdido la información del tipo debido a la eliminación (es decir, los tipos parametrizados se han borrado), de ahí la advertencia. No puede hacer nada al respecto, salvo limpiar el código que lo rodea para que los genéricos se utilicen con más frecuencia, de modo que pueda pasar la información de tipo genérico y evitar el envío de contenido.
La advertencia significa que el compilador no puede garantizar la seguridad del tipo, incluso si la conversión funciona bien en 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, recomiendo suprimir esta advertencia específica mediante la siguiente directiva de compilación:
@SuppressWarnings("unchecked")
No te preocupes Es porque el compilador de Java no tiene manera de saber, cuál es el tipo real del objeto.
Sí, esta es una consecuencia natural del borrado de tipo . Si o
es realmente una instancia de Action<String>
que no será capturada por el elenco, solo verá el problema cuando intente usarlo, pasando un ClientInterface
lugar de una cadena.
Puedes deshacerte de la advertencia usando:
@SuppressWarnings("unchecked")
como una anotación de función, pero no se puede resolver fácilmente el problema subyacente :(