Залп: вызов класса Kotlin из JavaCode - PullRequest
0 голосов
/ 11 июля 2019

Я бы хотел сделать простые Volley POST-запросы из-за Java и Kotlin.Я использую оба языка в своем приложении, поэтому я старался изо всех сил использовать оба языка.Я прочитал этот учебник со следующим VolleyClass в Kotlin:

класс WolfRequest (val url: String, val result: (JSONObject) -> Unit, val error: (String) ->Unit) {

fun POST(vararg params: Pair<String, Any>) {
    // HashMap to pass arguments to Volley
    val hashMap = HashMap<String, String>()
    params.forEach {
        // Convert all Any type to String and add to HashMap
        hashMap[it.first] = it.second.toString()
    }
    // Make the Http Request
    makeRequest(Request.Method.POST, hashMap)
}

private fun makeRequest(method: Int, params: HashMap<String, String>) {
    // Creating a StringRequest
    val req = object : StringRequest(method, url, { res ->

        // Creating JSON object from the response string
        // and passing it to result: (JSONObject) -> Unit function
        result(JSONObject(res.toString().trim()))
    }, { volleyError ->

        // Getting error message and passing it
        // to val error: (String) -> Unit function
        error(volleyError.message!!)
    }) {
        // Overriding getParams() to pass our parameters
        override fun getParams(): MutableMap<String, String> {
            return params
        }
    }

    // Adding request to the queue
    volley.add(req)
}

// For using Volley RequestQueue as a singleton
// call WolfRequest.init(applicationContext) in
// app's Application class
companion object {
    var context: Context? = null
    val volley: RequestQueue by lazy {
        Volley.newRequestQueue(context
                ?: throw NullPointerException(" Initialize WolfRequest in application class"))
    }

    fun init(context: Context) {
        this.context = context
    }
}

}

Я пытаюсь получить доступ к этому коду из Java.Class, чтобы сделать запрос POST:

    WolfRequest.Companion.init(getApplicationContext());
    HashMap <String, String> params = new HashMap <> ();
    params.put("id", "123");

    new WolfRequest(config.PING_EVENTS,*new WolfRequest()*
    {

        public void response(JSONObject response) {
            Log.e("Ping","PING");
        }

        public void error(String error) {
            Log.e("Ping",error);
        }
    }).POST(params);

Это дает мнездесь ошибка ( новый WolfRequest () ), говорящая: не могу наследовать от окончательного "... wolfrequest.kt"

Я действительно не получаю ошибку, в чем здесь проблема?

Спасибо

1 Ответ

1 голос
/ 11 июля 2019

Классы в kotlin являются окончательными по умолчанию.Чтобы создать окончательный класс, вам нужно объявить его как open.Итак, open class WolfRequest

С помощью new WolfRequest() {} в java вы создаете анонимный класс, который расширяет WolfRequest, поэтому вы получаете эту ошибку, наследующую от окончательного класса.

Чтобы вызвать конструктор дляWolfRequest вам нужно передать три аргумента.Что-то вроде:

new WolfRequest("", (s) -> Unit.INSTANCE, (s) -> Unit.INSTANCE){
....
}
...