Intereting Posts
Кордова 3.6.3 Файловый плагин – получить локальный видеофайл на Android Может ли кто-нибудь дать пример кода для TabHost в Android? Чтение с Android USB-аксессуаров вызывает ENODEV IOException Нарисовать овальную форму вокруг текста на холсте Как получить доступ к контексту рендеринга OpenGL на Android с помощью Delphi XE5? Подписка на Android и API Google Загрузка эмулятора Android, но не программа? Как оживить .gif изображения в Android? Android Studio: Тестирование: зависимости библиотек, которые были скомпилированы с использованием java 8 или выше Средство просмотра иерархии «Inspect Screenshot» ничего не показывает Android: GLES20: вызывается нереализованным API OpenGL ES Как я могу получить текущее географическое расположение устройства программно Android – обнаружение, если wifi WEP, WPA, WPA2 и т. Д. Программно Обработка ссылок в веб-просмотре Android-подписка на Android-Facebook – возможно использование нескольких ключевых хэшей?

Невозможно выполнить проверку экземпляра с параметризованным типом 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