Java包裹器问题
我正在构建一个连接到REST服务器的Android应用程序,我在模拟服务器响应的类中遇到以下错误: 错误:(16,15)错误:Parceler:找不到com.myapp.ServerResponse.result的java.lang.Object类型的读/写生成器 我认为错误是因为我使用了泛型类型E。ServerResponse.java是:Java包裹器问题,java,android,parcelable,parceler,Java,Android,Parcelable,Parceler,我正在构建一个连接到REST服务器的Android应用程序,我在模拟服务器响应的类中遇到以下错误: 错误:(16,15)错误:Parceler:找不到com.myapp.ServerResponse.result的java.lang.Object类型的读/写生成器 我认为错误是因为我使用了泛型类型E。ServerResponse.java是: public class ServerResponse <E> { @SerializedName("status") pri
public class ServerResponse <E> {
@SerializedName("status")
private int status;
@SerializedName("result")
private E result;
@SerializedName("message")
private String message;
//Getters and setters
}
公共类服务器响应{
@序列化名称(“状态”)
私人身份;
@SerializedName(“结果”)
私家侦探结果;
@SerializedName(“消息”)
私有字符串消息;
//接球手和接球手
}
有什么办法可以解决这个问题吗?你是对的,你不能打包泛型。(您也不能序列化无界泛型!) 当您有一个泛型类的实例时,该实例的类型在运行时被删除,因此只有具体的类型。在运行时,泛型类型参数的所有实例都将替换为其边界。此处使用的无界参数将替换为对象 您可能可以执行以下操作:
@Parcel
public class ServerResponse<E extends Parcelable> {
@SerializedName("result")
private E result;
}
@包裹
公共类服务器响应{
@SerializedName(“结果”)
私家侦探结果;
}
当类型被擦除时,这将用Parcelable替换E。Parceler library声称支持任何可包裹类型。您需要确保结果中的值是可包裹的,但您已经需要该值才能将其发送到包裹中。在这种情况下,包裹器选择速度,因此它不会使用
包裹。默认情况下,包裹/展开(),但是如果您想处理泛型,可以使用@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()));
}
}
@包裹
公共类服务器响应{
@ParcelPropertyConverter(ParcelsWrapperConverter.class)
私家侦探结果;
}
公共类ParcelsWrapperConverter扩展了NullableParcelConverter{
@凌驾
public void nullSafeToParcel(对象输入,android.os.Parcel){
Parcels.writeParcelable(包裹包裹包裹(输入),0);
}
@凌驾
公共对象nullSafeFromParcel(android.os.Parcel){
返回Parcels.unwrap(parcel.readParcelable(ParcelsWrapperConverter.class.getClassLoader());
}
}
只需确保您在ServerResponse中使用的值用@Parcel
注释,否则Parcels将引发运行时异常。此错误消失。现在我有这样一个问题:错误:任务的执行失败:app:compiledBugJava'>org.parceler.transfuse.TransfuseAnalysisException:@包裹代码生成未成功完成。