Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


No se puede realizar la comprobación de instancia contra el tipo parametrizado ArrayList <Foo>

El código siguiente:

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

Causas:

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

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

  • Evento de desinstalación de aplicaciones para Android para análisis
  • Proguard y reflexión en Android
  • AsyncTask con rotación de pantalla - onRetainNonConfigurationInstance obsoleta
  • Flurry Agent que causa una excepción CalledFromWrongThreadException en Android 2.3.4
  • Biblioteca FFT en android Sdk
  • Autenticación de Apache HttpClient Digest
  • ¿Advertencia de código muerto?
  • Utilizar ADB para capturar la pantalla
  • 8 Solutions collect form web for “No se puede realizar la comprobación de instancia contra el tipo parametrizado ArrayList <Foo>”

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

    Esto se denomina 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? Dado que la JVM no tiene información del tipo Parameterized en tiempo de ejecución, no hay manera de que pueda hacer una instanceof de ArrayList<Foo> . Puede "almacenar" el tipo parametrizado explícitamente y hacer una comparación allí.

    Siempre podría hacer esto en su lugar

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

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

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

    Esto es suficiente:

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

    De hecho, instanceof comprueba si el operando izquierdo es null o no y devuelve false si es realmente null .
    Así que: no hay necesidad de capturar NullPointerException .

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

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

    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 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.