Запись массивов Parcelables в Parcel в 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) типа Parcel неприменим для аргументов (Arrival [], int). Выведенный тип Arrival не является допустимой заменой ограниченного параметра ‹T extends Parcelable>

Я совершенно не понимаю это сообщение об ошибке. Parcelable - это интерфейс (а не класс), поэтому вы не можете его расширять. У кого-нибудь есть идеи?

ОБНОВЛЕНИЕ: у меня почти такая же проблема при помещении ArrayList из Parcelables в Intent:

Intent i = new Intent();
i.putParcelableArrayListExtra("locations", (ArrayList<Location>) locations);

дает:

Метод putParcelableArrayListExtra (String, ArrayList ‹? Extends Parcelable>) в типе Intent не применим для аргументов (String, ArrayList‹ Location>)

Это может быть связано с тем, что Location был классом, над которым я работал выше (который является оболочкой для Arrivals), но я так не думаю.


person Jeremy Logan    schedule 11.12.2009    source источник


Ответы (3)


Фактически, вы можете расширить интерфейс, и похоже, что вам нужно это сделать. Параметр generics в writeParcelableArray запрашивает расширенный интерфейс (а не сам интерфейс). Попробуйте создать интерфейс MyParcelable extends Parcelable. Затем объявите свой массив с помощью интерфейса, но имплементация должна быть вашим Arrival extends MyParcelable.

person harschware    schedule 11.12.2009

Оказывается, он просто хотел, чтобы я создал массив 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);
}
person Jeremy Logan    schedule 11.12.2009
comment
Как я уже сказал, объявите свой массив с помощью интерфейса. Рад, что у тебя все получилось. - person harschware; 13.12.2009

Я знаю, что проблема решена, но мое решение было другим, поэтому я публикую его здесь: в моем случае Eclipse автоматически импортировал неправильный пакет из-за неправильности имен классов (некоторый dom.Comment вместо моего класса комментариев).

person toommm    schedule 10.12.2011