У меня есть следующий класс:Странный ClassCastException при вызове Intent.getSerializableExtra()
public class IdList extends ArrayList<Long> {
public IdList() {
super();
}
public IdList(Collection<Long> idCollection) {
super(idCollection);
}
}
я передать экземпляр этого класса к IntentService
со следующим кодом:
final Intent intent = new Intent(this, MyService.class);
intent.putExtra(MyService.IDS, ids);
startService(intent);
И я использую следующий код, чтобы принести его в Service
:
IdList ids = (IdList) intent.getSerializableExtra(IDS);
Какие приводит к следующему ClassCastException
:
java.lang.ClassCastException: java.util.ArrayList не может быть приведен к my.package.IdList
НО
Отправка объекта тот же тип (IdList
) от Service
с использованием LocalBroadcastManager
и выборки его в onReceive()
(по тому же методу, позвонив по телефону getSerializableExtra()
по телефону Intent
и литье до IdList
) работает безупречно.
No ClassCastException
выброшено.
Почему это происходит? Это ошибка в Android?
EDIT:
Я использую следующий метод для создания экземпляра моего IdList
объекта:
public IdList getIds() {
return selectedIds.isEmpty() ? null : new IdList(selectedIds);
}
selectedIds
является HashSet<Long>
объектом.
EDIT2:
Я не ищу обходные пути. Я хотел бы знать, почему тот же код работает отлично, когда Intent
отправляется по широковещательной передаче и почему он бросает ClassCastException
, когда он передается по вызову startService()
.
Как вы создаете экземпляр 'ids' перед вызовом' intent.putExtra (MyService.IDS, ids); '? – gus27
Пожалуйста, покажите свой код для создания экземпляра переменной 'ids'. – gus27
Есть хорошая статья о вашей проблеме: [Таинственный случай Связки и Карта] (https://medium.com/the-wtf-files/the-mysterious-case-of-the-bundle-and-the -map-7b15279a794e # .l9yencapv) - также должен работать и для ArrayLists ;-) Это объясняет проблему и предлагает обходной путь. – gus27