java generics - No se puede realizar una instancia de verificación contra el tipo parametrizado ArrayList <Foo>





method return (8)


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 .

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?




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.




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);



Puedes usar

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



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);



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í.




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.




El bloque finally contiene líneas de código que deben ejecutarse independientemente de si se ha capturado una excepción o no. Incluso si decide detener la ejecución del código en ese método. Entonces el código después de que el tcf no se pueda ejecutar, pero el código finalmente está "garantizado" (garantizado en el sentido de que no se bloquea de forma inmediata y no se puede manipular el error).





java android generics