我正在构建一个连接到REST服务器的Android应用程序,我在课堂上收到了这个模型服务器响应的错误:
错误:(16,15)错误:Parceler:无法为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
}
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
Parceler在这种情况下选择速度,因此默认情况下它不会使用Parcels.wrap
/ unwrap()
,但如果您想要处理泛型,可以使用@ParcelPropertyConveter
它使用Parcels.wrap()
/ unwrap()
方法:
@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
进行注释,否则Parcel将抛出运行时异常。
答案 1 :(得分:0)
你是对的,你不能包裹仿制药。 (你也不能序列化无界的泛型!)
当你有一个泛型类的实例时,该实例的类型在运行时被擦除,因此只有具体的类型。在运行时,泛型类型参数的所有实例都由其边界替换。你在这里使用的无界参数被Object替换。
您可以这样做:
reset()
当擦除类型时,这将用Parcelable替换E. Parceler库声称支持任何Parcelable类型。您需要确保Result 中的值是parcelable,但您已经需要将其发送到Parcel中。