我正在构建一个连接到REST服务器的Android应用程序,我在模拟服务器响应的类中得到了这个错误:
错误:(16,15)错误:打包程序:找不到com.myapp.ServerResponse.result的类型java.lang.Object的读/写生成器
我认为错误是因为我使用了泛型类型E。ServerResponse.java是:
public class ServerResponse <E> {
@SerializedName("status")
private int status;
@SerializedName("result")
private E result;
@SerializedName("message")
private String message;
//Getters and setters
}有没有办法解决这个问题?
发布于 2015-07-16 12:19:26
在这种情况下,Parceler选择了速度,因此默认情况下它不会使用Parcels.wrap/unwrap(),但如果您希望处理泛型,则可以使用使用Parcels.wrap()/unwrap()方法的@ParcelPropertyConveter:
@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将抛出运行时异常。
发布于 2015-07-16 02:52:21
你说得对,你不能打包泛型。(您也不能序列化无界泛型!)
当您有一个泛型类的实例时,该实例的类型在运行时被擦除,因此只有具体的类型。在运行时,泛型类型参数的所有实例都由其边界替换。像您在这里使用的无界参数将被Object替换。
您可能能够执行以下操作:
@Parcel
public class ServerResponse<E extends Parcelable> {
@SerializedName("result")
private E result;
}当类型被擦除时,这将用Parcelable替换E。Parceler库声称支持任何Parcelable类型。您需要确保Result中的值是可打包的,但您已经需要该值才能将其发送到Parcel中。
https://stackoverflow.com/questions/31437500
复制相似问题