可打包过载解析度不明确

时间:2019-03-27 19:08:28

标签: kotlin parcelable

我正在尝试在Kotlin中创建JSON响应的POJO(即Kotlin中的数据类)结构。我已经为结构中的每个数据类实现了Parcelable接口。在所有数据类中,我已经自动生成了Parcelable实现。问题是IDE抱怨的是生成的第二个构造函数:

  

过载分辨率不明确

它声明这两个构造函数之间存在混淆:

public constructor GeocodeRes(parcel: Parcel)
public constructor GeocodeRes(responset: ResponseRes)

我认为这是有道理的,因为ResponseRes也是Parcelable类型(ResponseRes实现Parcelable)。因此,调用GeocodeRes(parcel)方法(在createFromParcel伴随方法中)会感到困惑。

直到我从实现Parcelable类中删除ResponseRes为止,它仍然显示相同的错误。

有什么理由吗?我可以正确设置吗?在所有的子数据类中,它们都实现了Parcelable接口(彼此依赖),但是没有遇到任何问题。

这是我的GeocodeRes类:

import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.Expose
import com.google.gson.annotations.SerializedName

data class GeocodeRes(
@SerializedName("Response") @Expose val responset: ResponseRes
) : Parcelable {



// this is the problem. the IDE is complaining that the usage is too ambiguous (). however, the only usage of this constructor is within this class - just doesn't tell me where exactly. 
constructor(parcel: Parcel) : this(parcel.readParcelable(ResponseRes::class.java.classLoader)) {
}



override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeParcelable(responset, flags)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<GeocodeRes> {
    override fun createFromParcel(parcel: Parcel): GeocodeRes {
        return GeocodeRes(parcel)
    }

    override fun newArray(size: Int): Array<GeocodeRes?> {
        return arrayOfNulls(size)
    }
}


}

这是我的ResponseRes课:

data class ResponseRes(
    @SerializedName("MetaInfo") @Expose val metaInfo: MetaInfo,
    @SerializedName("View") @Expose val views: List<View>
    ): Parcelable 
{
[...]//parcel methods
}

1 个答案:

答案 0 :(得分:1)

  

但是,此构造函数的唯一用法是在此类中-只是没有告诉我确切的位置

问题在于定义本身,而不是任何用法。它永远无法使用,并且错误仍然存​​在。

您应该可以通过指定要阅读的哪个 Parcelable来解决此问题:

this(parcel.readParcelable<ResponseRes>(ResponseRes::class.java.classLoader))

编译器无法确定您的意思还是

this(parcel.readParcelable<Parcel>(ResponseRes::class.java.classLoader))

即使第二个都不合法,因为如果您查看签名,Parcel并没有实现Parcelable

<T extends Parcelable> T readParcelable(ClassLoader loader) 

您只能看到返回类型可用于推断T,而不是参数。因此,编译器需要在尝试推断T之前,在 之前选择构造函数重载。