Рассмотрим следующие классы / интерфейсы:
interface ExampleKotlinInterface {
val name: String
}
interface ExampleKotlinInterfaceSubclass : ExampleKotlinInterface {
override var name: String
}
abstract class ExampleKotlinImpl(@SerializedName("name") override val name: String = "zach") : ExampleKotlinInterface
class ExampleKotlinImplSubclass(override var name: String) : ExampleKotlinImpl(name), ExampleKotlinInterfaceSubclass
, где первый интерфейс определяет значение name
, а второй интерфейс расширяет его, но выставляет значение name
как переменную. Я не могу разобрать ExampleKotlinImplSubclass
с Gson из-за следующей ошибки:
java.lang.IllegalArgumentException: class com.example.kotlingetterinterfaceexample.ExampleKotlinImplSubclass declares multiple JSON fields named name
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
at com.google.gson.Gson.getAdapter(Gson.java:458)
at com.google.gson.Gson.fromJson(Gson.java:926)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.example.kotlingetterinterfaceexample.ExampleGsonParseTests.testParseObject(ExampleGsonParseTests.kt:13)
используя этот тестовый код:
val json = "{ \"name\" : \"test\" }"
val result = Gson().fromJson(json, ExampleKotlinImplSubclass::class.java)
assertNotNull(result)
assertEquals("test", result.name)
Теория заключается в том, что моему суперклассу нельзя разрешать изменять значение name
, но подкласс должен это делать.
Любые идеи о том, как обойти это?
Ссылка на пример проекта, показывающий эту проблему: https://github.com/ZOlbrys/kotlingetterinterfaceexample