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 parametrizadoArrayList<Foo>
. Utilice el formularioArrayList<?>
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í.