Неоднозначность разрешения распределяемой перегрузки

#kotlin #parcelable

#kotlin #распределяемая

Вопрос:

Я пытаюсь создать структуру POJO (она же классы данных в Kotlin) ответа JSON в Kotlin. Я реализовал разделяемый интерфейс для каждого класса данных в структуре. Во всех классах данных я автоматически сгенерировал реализацию Parcelable. Проблема заключается в сгенерированном втором конструкторе, на который жалуется IDE:

Неоднозначность разрешения перегрузки

В нем говорится, что он путается между этими двумя конструкторами:

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

Что, я полагаю, имеет смысл, потому что ResponseRes также имеет тип Parcelable (ResponseRes реализует Parcelable). Таким образом, вызывая метод GeocodeRes (parcel) (в рамках сопутствующего метода createFromParcel), он запутывается.

Это было до тех пор, пока я не удалил ResponseRes из реализации класса Parcelable, и он все еще показывает ту же ошибку.

Есть ли какая-либо причина для этого? Правильно ли я это настраиваю? Во всех дочерних классах данных все они реализуют интерфейс 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:

однако этот конструктор используется только в этом классе — просто не говорит мне, где именно

Проблема заключается в самом определении, а не в каком-либо использовании. Это никогда не могло быть использовано, и ошибка все равно была бы там.

Вы должны быть в состоянии исправить это, указав, что 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 .

Комментарии:

1. Спасибо! Я знал, что это было что-то вроде этого. Человек!