propiedades - set border java
java: Cómo corregir la advertencia de conversión no comprobada (3)
Escriba @SuppressWarnings("unchecked")
sobre la declaración de Cast:
@SuppressWarnings("unchecked")
T result = (T)store.get(e);
Y agregue una declaración explicativa de por qué es seguro ignorar la advertencia.
Tengo el siguiente código:
private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;
public <T extends Component> T getComponent(Entity e, Class<T> exampleClass)
{
HashMap<Entity, ? extends Component> store = m_componentStores.get(exampleClass);
T result = (T)store.get(e);
if (result == null)
{
throw new IllegalArgumentException( "GET FAIL: "+e+" does not possess Component of class/nmissing: "+exampleClass );
}
return result;
}
Cuando compilo, muestra que T result = (T)store.get(e)
tiene una T result = (T)store.get(e)
no seleccionada.
Type safety: Unchecked cast from capture#2-of ? extends Component to T
¿Qué me falta para evitar que aparezca esta advertencia?
Class.cast
es lo que quieres. Bueno, podrías considerar no usar la reflexión.
Cambia la línea:
T result = (T)store.get(e);
a:
T result = exampleClass.cast(store.get(e));
extends
en genéricos realmente no funciona de esa manera. T
! = ? extends Component
? extends Component
a pesar de que T extends Component
. Lo que tienes es, de hecho, una captura de comodín , tiene un propósito diferente.
Y sí, su solución no es segura para el tipo: ¿no hay relación entre los dos ?
marcas en
private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;
Por lo tanto, se vuelve legal colocar una instancia de alguna subclase de Component
en esta estructura usando alguna otra clase (ni siquiera una subclase de Component
) como la clave.
Recuerde que los tipos genéricos se resuelven solo en tiempo de compilación , por lo que en el tiempo de ejecución m_componentStores
no tiene forma de saber qué tipo exacto de valor tiene allí, aparte de que extends
Component
.
Entonces el tipo que obtienes de store.get(e)
es ... Component
:
Component result = store.get(e);
Cuando lanza el Component
a T
, el compilador emite una advertencia porque la conversión no se puede verificar de forma estática. Pero si está seguro de la semántica de su estructura de datos, simplemente puede suprimir la advertencia.
@SuppressWarnings("unchecked")
T resultT = (T)result;
PD: no necesita una captura de comodín, lo siguiente funcionará exactamente igual en su caso:
private HashMap<Class<?>, HashMap<Entity, Component>> m_componentStores;