Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java包裹器问题_Java_Android_Parcelable_Parceler - Fatal编程技术网

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

我正在构建一个连接到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
}
公共类服务器响应{
@序列化名称(“状态”)
私人身份;
@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:@包裹代码生成未成功完成。