Устраняемая неоднозначность разрешения перегрузки - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать структуру POJO (иначе классы данных в Kotlin) ответа JSON в Kotlin.Я реализовал интерфейс Parcelable для каждого класса данных в структуре.Во всех классах данных я автоматически создал реализацию 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 Ответ

1 голос
/ 28 марта 2019

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

Проблема в самом определении, а не в использовании. Он никогда не может быть использован, и ошибка все еще будет там.

Вы можете исправить это, указав который 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.

...