首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Parceler的问题

Java Parceler的问题
EN

Stack Overflow用户
提问于 2015-07-16 01:46:28
回答 2查看 1.4K关注 0票数 1

我正在构建一个连接到REST服务器的Android应用程序,我在模拟服务器响应的类中得到了这个错误:

错误:(16,15)错误:打包程序:找不到com.myapp.ServerResponse.result的类型java.lang.Object的读/写生成器

我认为错误是因为我使用了泛型类型E。ServerResponse.java是:

代码语言:javascript
复制
public class ServerResponse <E> {
    @SerializedName("status")
    private int status;

    @SerializedName("result")
    private E result;

    @SerializedName("message")
    private String message;

    //Getters and setters
}

有没有办法解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2015-07-16 12:19:26

在这种情况下,Parceler选择了速度,因此默认情况下它不会使用Parcels.wrap/unwrap(),但如果您希望处理泛型,则可以使用使用Parcels.wrap()/unwrap()方法的@ParcelPropertyConveter

代码语言:javascript
复制
@Parcel
public class ServerResponse <E> {

    @ParcelPropertyConverter(ParcelsWrapperConverter.class)
    private E result;
}

public class ParcelsWrapperConverter extends NullableParcelConverter<Object> {

    @Override
    public void nullSafeToParcel(Object input, android.os.Parcel parcel) {
        parcel.writeParcelable(Parcels.wrap(input), 0);
    }

    @Override
    public Object nullSafeFromParcel(android.os.Parcel parcel) {
        return Parcels.unwrap(parcel.readParcelable(ParcelsWrapperConverter.class.getClassLoader()));
    }
}

只需确保您在ServerResponse中使用的值带有@Parcel注释,否则Parcels将抛出运行时异常。

票数 2
EN

Stack Overflow用户

发布于 2015-07-16 02:52:21

你说得对,你不能打包泛型。(您也不能序列化无界泛型!)

当您有一个泛型类的实例时,该实例的类型在运行时被擦除,因此只有具体的类型。在运行时,泛型类型参数的所有实例都由其边界替换。像您在这里使用的无界参数将被Object替换。

您可能能够执行以下操作:

代码语言:javascript
复制
@Parcel
public class ServerResponse<E extends Parcelable> {
    @SerializedName("result")
    private E result;
}

当类型被擦除时,这将用Parcelable替换E。Parceler库声称支持任何Parcelable类型。您需要确保Result中的值是可打包的,但您已经需要该值才能将其发送到Parcel中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31437500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档