如何取消对象,其中field是子类?

时间:2014-08-13 10:46:36

标签: android parcelable

我处在一个我必须在具有自定义字段的类上实现Parcelable接口的位置,该字段可以是Shape类的任何子类:

class MyClass implements Parcelable
{
    Shape shape;
}

现在,如果我想将形状字段写入包裹,这很容易:

@Override
public void writeToParcel(Parcel dest, int flags)
{
    dest.writeParcelable(shape, flags);
}

这没关系,因为Shape对象可以是任何扩展Shape的对象,它会正确写入。

但是当我从parcel读取对象时,我必须传递实例类的ClassLoader,但此时我不知道实际的实例应该是什么。对于Shape,它可以是三角形,正方形或圆形。

    @Override
    public MyClass createFromParcel(Parcel source)
    {
        MyClass o = new Myclass();
        o.shape = source.readParcelable(Shape.class); // ???
        return o;
    }

我目前的解决方法是使用Serializable来编写此对象,但效率非常低。 解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

据我所知,当您阅读Shape.class时,可以使用Parcelable,因为它会返回SubClass的实例,其效果正常 您的Shape子类自行实施Parcelable方法writeToParcel(),并拥有自己的CREATOR个变量。子类不能依赖CREATOR的{​​{1}}。