【问题标题】:Parceler use inheriting generic typeParceler 使用继承泛型类型
【发布时间】:2016-02-18 23:52:54
【问题描述】:

我正在努力寻找一种在特定情况下使用 parceler 库的方法。

有一个泛型类型的抽象类,像这样

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 类)。有没有可能让它成为可能?尝试遵循here 的一些建议,但没有成功。

【问题讨论】:

    标签: android parceler


    【解决方案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);
        }
    }
    

    我想我们可以确定这种隐含类型,但目前这是最接近的解决方案。

    【讨论】:

    • 感谢您的快速回答 :) 解决了。
    猜你喜欢
    • 2018-09-27
    • 2015-09-15
    • 2021-10-11
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多