Я пытаюсь написать модифицированный конвертер в kotlin.Однако я застрял при попытке вернуть конвертеры:
class JSONRPCConverterFactory private constructor(private val gson : Gson): Converter.Factory() {
companion object {
private val MEDIA_TYPE = MediaType.get("application/json")
fun create(gson: Gson) = JSONRPCConverterFactory(gson)
}
inner class JSONRPCRequestBodyConverter<T : JSONRPCRequest<*>>(private val gson: Gson) : Converter<T, RequestBody> {
override fun convert(value: T): RequestBody? {
val jsonString = gson.toJson(value, object:TypeToken<T>(){}.type)
return RequestBody.create(MEDIA_TYPE, jsonString)
}
}
inner class JSONRPCResponseBodyConverter<T>(private val gson: Gson) : Converter<ResponseBody, T> {
override fun convert(value: ResponseBody): T? {
return gson.fromJson(value.string(), object:TypeToken<T>(){}.type)
}
}
override fun responseBodyConverter(type: Type, annotations: Array<Annotation>, retrofit: Retrofit): Converter<ResponseBody, *>? {
if (!hasJSONRPCAnnotation(annotations)) return null
return JSONRPCResponseBodyConverter(gson)
}
override fun requestBodyConverter(type: Type, parameterAnnotations: Array<Annotation>, methodAnnotations: Array<Annotation>, retrofit: Retrofit): Converter<*, RequestBody>? {
if (!hasJSONRPCAnnotation(methodAnnotations)) return null
return JSONRPCRequestBodyConverter(gson)
}
private fun hasJSONRPCAnnotation(annotations: Array<Annotation>) : Boolean {
for (annotation in annotations) {
if (annotation is JSONRPC) return true
}
return false
}
}
Ошибка появляется в этих двух строках:
return JSONRPCResponseBodyConverter(gson)
и
return JSONRPCRequestBodyConverter(gson)
Ошибка вывода типа: недостаточно информации для вывода параметра T в
конструкторе JSONRPCRequestBodyConverter> (gson: Gson)
Укажите его явно.
В Java этоможно вернуть только new JSONRPCResponseBodyConverter<>(gson)
.Однако в kotlin тип является обязательным, поэтому добавление только <>
также не удастся.
Просматривая этот конвертер с помощью Kotlin-lang: Преобразователь сериализации Kotlin , я увидел, что он используетпочти такой же классовой структуры и просто возвращает новый конвертер без бриллиантов, и он работает.
Что мне не хватает?