Невозможно выполнить проверку экземпляра с параметризованным типом ArrayList <Foo>

Следующий код:

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

причины:

Невозможно выполнить проверку instanceof с параметризованным типом ArrayList<Foo> . Вместо этого используйте форму ArrayList<?> как дополнительная информация о типовом типе будет удалена во время выполнения

Может ли кто-нибудь объяснить мне, что подразумевается под «дополнительной информацией о родовом типе будет стерто во время выполнения» и как это исправить?

Это означает, что если у вас есть что-то, что параметризовано, например List<Foo> fooList = new ArrayList<Foo>(); , Информация Generics будет удалена во время выполнения. Вместо этого, это то, что JVM увидит List fooList = new ArrayList(); ,

Это называется стиранием типа . JVM не имеет параметризованной информации о типе List (в примере) во время выполнения.

Исправить? Поскольку JVM не имеет информации о параметризованном типе во время выполнения, вы не можете сделать instanceof ArrayList<Foo> . Вы можете «сохранить» параметризованный тип явно и провести там сравнение.

Вы всегда можете это сделать

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

Из-за стирания типа параметризованный тип ArrayList не будет известен во время выполнения. Лучшее, что вы можете сделать с instanceof – проверить, является ли tempVar ArrayList (чего-то). Чтобы сделать это универсальным способом, используйте:

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

Этого достаточно:

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

Фактически instanceof проверяет, является ли левый операнд null или нет, и возвращает false если он фактически является null .
Итак: нет необходимости перехватывать NullPointerException .

Вы не можете это исправить. Информация о типе для Generics недоступна во время выполнения, и у вас не будет доступа к ней. Вы можете только проверить содержимое массива.

Оператор instanceof работает во время выполнения. Но java не несет данные параметризованного типа во время выполнения. Они стираются во время компиляции. Отсюда ошибка.

Вы всегда можете это сделать

Создать класс

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

Не то же самое, но …

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

Вы можете использовать

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