Запись массивов посылок в посылку в 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 не является допустимой заменой ограниченного параметра

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

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

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

выходы:

Метод putParcelableArrayListExtra (String, ArrayList) в типе Intent не применим для аргументов (String, ArrayList)

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

3 ответа

Решение

Оказывается, он просто хотел, чтобы я создал массив 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);
}

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

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

Другие вопросы по тегам