Парсер использует наследование универсального типа

Я изо всех сил пытаюсь найти способ использовать библиотеку посылок в конкретном случае.

Наличие абстрактного класса с родовыми типами, как это

public abstract class ParentClass<O> {

    private String id;
    private O options;

    public String getId() {
        return id;
    }

    public void setId(String id) {
       this.id = id;
    }

    public O getOptions() {
        return options;
    }

    public void setOptions(O options) {
        this.options = options;
    }

}

И еще один класс, который мы будем использовать в качестве параметров (который мы будем сериализовать)...

@Parcel(Parcel.Serialization.BEAN)
public class MyOptions {

    private boolean option1;

    public boolean getOption1() {
        return option1;
    }

    public void setOption1(boolean option1) {
        this.option1 = option1;
    }
}

И третий класс, который мы хотим сериализовать, называется ChildClass

@Parcel(Parcel.Serialization.BEAN)
public class ChildClass extends ParentClass<MyOptions>{}

Несмотря на то, что я не сериализую ParentClass, а просто ChildClass, я получаю ошибку компилятора при попытке построить проект

Parceler: Unable to find read/write generator for type java.lang.Object for ParentClass#options
    public void setOptions(O options) {

Мне известно, что в документации говорится, что "Parcel выдаст ошибку, если универсальный параметр не сопоставлен", но в этом случае меня интересует только сериализация ChildClass при сохранении атрибутов из ParentClass (то есть id и экземпляр класса. MyOptions). Есть ли возможность сделать это возможным? Пытался следовать некоторым советам здесь, но безуспешно.

1 ответ

Решение

Не лучший вариант, но вы можете обойти эту проблему, переопределив getOptions() а также setOptions() методы в вашем базовом классе. Это определяет тип для Parceler:

@Parcel(Parcel.Serialization.BEAN)
public class ChildClass extends ParentClass<MyOptions>{

    @Override
    public MyOptions getOptions() {
        return super.getOptions();
    }

    @Override
    public void setOptions(MyOptions options) {
        super.setOptions(options);
    }
}

Я предполагаю, что мы могли бы определить этот подразумеваемый тип, но пока это самое близкое решение.

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