Запись массивов Parcelables в посылку в Android

Я пытаюсь написать массив объектов, которые реализуют Parcelable на участка используя 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) типа Посылка не применяется для аргументы (Arrival [], int). Этот выводимый тип прибытия не является допустимым заменить ограниченный параметр

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

обновление: у меня в основном такая же проблема при установке ArrayList of Parcelables в Intent:

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

выходы:

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

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

3 ответов


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


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

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