Я использую Gson v2.8.2 и Retrofit v2.3.0, и у меня есть два класса, Answer.kt:
open class Answer(@SerializedName("answer")
var text: String,
val id: Int)
и AnswerSummary.kt:
class AnswerSummary(val answer: Answer) : Answer(answer.text, answer.id) {
val percent: Int = 0
}
Я использую его в списке (на Java, все еще переходя на Kotlin):
public List<AnswerSummary> getAnswerSummaries() {
return answerSummaries;
}
Я получаю сообщение об ошибке, когда val
не удаляется: class AnswerSummary(val answer: Answer) ...
:
java.lang.IllegalArgumentException: Unable to create converter for class com.name.app.model.response.AnswerResponse
....
Caused by java.lang.IllegalArgumentException: class com.name.app.model.pojo.AnswerSummary declares multiple JSON fields named answer
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
....
После удаления 'val': class AnswerSummary(answer: Answer) ...
ошибка исчезнет. Почему это так, поскольку я аннотировал только одно поле? - @SerializedName("answer") var text: String
.
Я нашел способ обойти сбой, сохраняя неизменность ('val') - используя другое имя переменной: class AnswerSummary(val ans: Answer) ...
. Что происходит за фоном - связано ли это с тем, что значение поля @SerializedName совпадает с именем переменной?