una son qué que pila objeto metodos genericos generico generica generic entidad crear como clase arreglos java generics typeerror instanceof

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.