java - son - ¿Por qué instanceof no funciona con Genérico?
que es una clase generica en java (5)
Posible duplicado:
Java: Instancia de y Genéricos
Estoy tratando de escribir una función que convierte una lista genérica a un tipo específico de lista. Encuentra el código de abajo
public <T>List<T> castCollection(List srcList, Class<T> clas){
List<T> list =new ArrayList<T>();
for (Object obj : srcList) {
if(obj instanceof T){
...
}
}
return list;
}
Pero obj instanceof T
mostrando un error de compilación -
No se puede realizar una comprobación de instancia contra el parámetro de tipo T. En su lugar, utilice su Objeto de eliminación> ya que se borrará más información de tipo genérico en tiempo de ejecución.
¿Alguna aclaración o forma de obtener el resultado deseado?
Gracias por adelantado. :)
Debido a que Java utiliza el borrado, los tipos genéricos no se pueden usar para verificar.
Para obtener el resultado deseado, use Class.isInstance()
.
Los tipos genéricos se erased después de la compilación (los genéricos son para la seguridad del tipo de tiempo de compilación) y se reemplazarán con el tipo más aplicable después de la compilación.
Si quieres hacer esta compilación, reemplaza T por tipo concreto, ejemplo
obj instance String
No puedes hacerlo de esta manera. Afortunadamente, ya tienes un argumento de Class<T>
así que en vez
myClass.isAssignableFrom(obj.getClass())
Esto devolverá verdadero si obj
es de la clase myClass
o subclase.
Como @ILMTitan señaló (gracias), deberá verificar obj == null
para evitar una posible NullPointerException, o usar myClass.isInstance(obj)
lugar. O hace lo que necesitas.
Respuesta corta: porque un parámetro de tipo en Java es algo que solo utiliza el compilador para otorgar seguridad de tipo.
En el tiempo de ejecución, la información de tipo sobre los tipos genéricos se descarta debido al borrado de tipo, pero instanceof
es una verificación de tiempo de ejecución que necesita un tipo concreto (no una variable de tipo) para funcionar.
T
es un tipo parametrizado y existe para propósitos de compilación. No existe en tiempo de ejecución debido al borrado de tipo.
Por lo tanto, obj instanceof T
no es legal.