Kotlin: переопределить функцией с параметром reified типа - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь передать generic object методу override, который реализует методы из interface.

К сожалению, я получаю ошибку при попытке реализовать это. Ошибка выглядит следующим образом:

Переопределить с помощью функции с параметром уточненного типа

Вот мой код

class ServiceVolley : ServiceInterface {

    val TAG = ServiceVolley::class.java.simpleName
    val basePath = "http://192.168.68.104:3005/"

    override inline fun <reified T> post(
        resource: String,
        payload: JSONObject,
        crossinline onSuccess: (response: JSONObject?) -> Unit,
        crossinline onError: (statusCode: Int) -> Unit
    ) {
        val jsonObjReq = object : JsonObjectRequest(Method.POST, basePath + resource, payload,
            Response.Listener<JSONObject> { response ->
                Klaxon().parse<T>(response.toString())
                onSuccess(response)
            },
            Response.ErrorListener { error ->
                onError(error.networkResponse.statusCode)
            }) {
            @Throws(AuthFailureError::class)
            override fun getHeaders(): Map<String, String> {
                val headers = HashMap<String, String>()
                headers["Content-Type"] = "application/json"
                headers["withCredentials"] = "true"
                return headers
            }
        }

        BackendVolley.instance?.addToRequestQueue(jsonObjReq, TAG)
    }
}
interface ServiceInterface {
    fun <T> post(resource: String, payload: JSONObject, onSuccess: (response: JSONObject?) -> Unit, onError: (statusCode: Int) -> Unit)
}

и я вызовите эту функцию со следующим

apiController.post<User>("user/sign-in", payload,
{ user: User? ->
    Log.d("RESPONSE", user.toString());
},
{ statusCode: Int ->
    Log.d("ERROR", statusCode.toString())
})

1 Ответ

0 голосов
/ 02 марта 2020

См. Эту проблему: Переопределение встроенной функцией должно быть предупреждением, переопределение функцией с параметром reified type должно быть ошибкой .

В основном: с виртуальными функциями, какая функция вызываемый определяется во время выполнения; поэтому они не могут быть встроены, потому что компилятор не знает, какую функцию встроить. Когда вы делаете что-то вроде

interface A {
    fun f(t: Int)
}

class AImpl : A {
    override inline fun f(t: Int) {
        println(t.toString())
    }
}

val a: A = AImpl()
a.f(1)

, вызывается не встроенная версия AImpl.f.

Но функции с reified должны быть встроенными, иначе они не будут работать. Поэтому их нельзя использовать для переопределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...