type parameter method generico generic java android generics

parameter - java generics



No se puede realizar una instancia de verificación contra el tipo parametrizado ArrayList<Foo> (8)

El siguiente código:

((tempVar instanceof ArrayList<Foo>) ? tempVar : null);

causas:

No se puede realizar una instanceof verificación contra el tipo parametrizado ArrayList<Foo> . Utilice el formulario ArrayList<?> lugar, ya que se borrará más información de tipo genérico en tiempo de ejecución

¿Puede alguien explicarme qué se entiende por "se borrará más información de tipo genérico en el tiempo de ejecución" y cómo solucionarlo?


Debido al borrado de tipo, el tipo parametrizado de ArrayList no se conocerá en tiempo de ejecución. Lo mejor que puede hacer con instanceof es comprobar si tempVar es una ArrayList (de cualquier cosa). Para hacer esto de una manera genérica, use:

((tempVar instanceof ArrayList<?>) ? tempVar : null);


El operador de instanceof funciona en tiempo de ejecución. Pero java no lleva la información del tipo parametrizado en tiempo de ejecución. Se borran en el momento de la compilación. De ahí el error.


Esto es suficiente:

if(obj instanceof ArrayList<?>) { if(((ArrayList<?>)obj).get(0) instanceof MyObject) { // do stuff } }

De hecho, un instanceof comprueba si el operando izquierdo es null o no y devuelve false si es realmente null .
Entonces: no es necesario atrapar NullPointerException .


No puedes arreglar eso. La información de tipo para Generics no está disponible en tiempo de ejecución y no tendrá acceso a ella. Solo puedes verificar el contenido de la matriz.


Puedes usar

boolean isInstanceArrayList = tempVar.getClass() == ArrayList.class


Siempre puedes hacer esto

Crear una clase

public class ListFoo { private List<Foo> theList; public ListFoo(List<Foo> theList { this.theList = theLista; } public List<Foo> getList() { return theList; } }

No es lo mismo pero ...

myList = new ArrayList<Foo>; ..... Object tempVar = new ListFoo(myList); .... ((tempVar instanceof ListFoo) ? tempVar.getList() : null);


Siempre puedes hacer esto en su lugar

try { if(obj instanceof ArrayList<?>) { if(((ArrayList<?>)obj).get(0) instanceof MyObject) { // do stuff } } } catch(NullPointerException e) { e.printStackTrace(); }


Significa que si tiene algo que está parametrizado, por ejemplo, List<Foo> fooList = new ArrayList<Foo>(); , la información de Generics se borrará en el tiempo de ejecución. En cambio, esto es lo que la JVM verá List fooList = new ArrayList(); .

Esto se llama borrado de tipo . La JVM no tiene información de tipo parametrizada de la List (en el ejemplo) durante el tiempo de ejecución.

¿Un arreglo? Como la JVM no tiene información del tipo Parametrizado en tiempo de ejecución, no hay forma de que pueda hacer una instanceof de ArrayList<Foo> . Puede "almacenar" el tipo parametrizado explícitamente y hacer una comparación allí.