Модифицированный конвертер с kotlin: вывод типа не удался - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь написать модифицированный конвертер в 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 , я увидел, что он используетпочти такой же классовой структуры и просто возвращает новый конвертер без бриллиантов, и он работает.

Что мне не хватает?

1 Ответ

0 голосов
/ 13 декабря 2018

Проблема в том, что для JSONRPCResponseBodyConverter и JSONRPCRequestBodyConverter требуется параметр типа T, и компилятор не может определить этот тип на вызывающем сайте.Пример, который вы видели, вероятно, каким-то образом выводит тип T, например, его параметры или тип, которому он назначается.

class A<T>(t: T? = null)

val a1 : A<Int> = A() //this will work, it can infer the type from the asigment
val a2 = A(2) //this will work, it can infer the type from the parameter
val a3 = A() //this won't work, the compiler has no way of knowing the type of T
...