Запись массивов Parcelables на парцеллу в Android
Я пытаюсь написать массив объектов, которые реализуют Parcelable в Parcel, используя writeParcelableArray.
Объекты, которые я пытаюсь записать, определяются (как и ожидалось) как:
public class Arrival implements Parcelable {
/* All the right stuff in here... this class compiles and acts fine. */
}
И я пытаюсь записать их в "Посылку" с помощью:
@Override
public void writeToParcel(Parcel dest, int flags) {
Arrival[] a;
/* some stuff to populate "a" */
dest.writeParcelableArray(a, 0);
}
Когда Eclipse пытается скомпилировать это, я получаю ошибку:
Связанное несоответствие: общий метод writeParcelableArray (T [], int) типа Посылка не применяется для аргументы (Прибытие [], int). inferred type Прибытие недействительно замените ограниченный параметр < T расширяет Parcelable >
Я полностью не понимаю это сообщение об ошибке. Parcelable
- это интерфейс (а не класс), поэтому вы не можете его расширять. У кого-нибудь есть идеи?
ОБНОВЛЕНИЕ: У меня в основном такая же проблема, когда ArrayList
Parcelable
помещается в Intent
:
Intent i = new Intent();
i.putParcelableArrayListExtra("locations", (ArrayList<Location>) locations);
дает:
Метод putParcelableArrayListExtra (String, ArrayList <? extends Parcelable > ) в типе Intent не применим для аргументов (String, ArrayList <Location> )
Это может быть связано с тем, что Location
был классом, над которым я работал выше (который обертывает Arrival
s), но я так не думаю.
Ответы
Ответ 1
Оказывается, он просто хотел, чтобы я создал массив Parcelables. Чтобы использовать пример из вопроса:
@Override
public void writeToParcel(Parcel dest, int flags) {
Parcelable[] a;
/*
some stuff to populate "a" with Arrival
objects (which implements Parcelable)
*/
dest.writeParcelableArray(a, 0);
}
Ответ 2
На самом деле вы можете расширить интерфейс, и похоже, что вам нужно сделать именно это. Параметр generics в writeParcelableArray запрашивает расширенный интерфейс (а не сам интерфейс). Попробуйте создать интерфейс MyParcelable расширяет Parcelable. Затем объявляя ваш массив с помощью интерфейса, но имплант должен быть вашим Прибытием расширяет MyParcelable.
Ответ 3
Я знаю, что проблема решена, но мое решение было другим, поэтому я размещаю его здесь: в моем случае Eclipse автоматически импортировал неправильный пакет из-за несовместимости имен классов (некоторые dom.Comment вместо моего класса Comment).