Kotlin语法混乱:传递带有lambda的接口

时间:2018-07-26 17:18:03

标签: kotlin android-volley

我正在研究Android的Kotlin编程,并且试图深入理解此代码(有效)。 它来自Volley库,用于网络请求:

//Network stuff
    // Request a string response from the provided URL.
    val jsonObjectRequest = object : JsonObjectRequest(Method.POST, http, ob,
            Response.Listener<JSONObject> { response ->
                // Display the first 500 characters of the response string.
                Log.d("Debug","Response is: ${response.toString()} ")

            },
            Response.ErrorListener { error ->
                Log.d("Debug","That didn't work! Code: ${error.message}")
            })
    {
        @Throws(AuthFailureError::class)
            override fun getHeaders(): Map<String, String> {
                val headers = HashMap<String, String>()
                headers.put("Content-Type", "application/json")
                headers.put("Accept", "application/json")
                return headers
        }

    }

我的问题是关于JsonObjectRequest对象的构造函数中的第一个块。我知道对象的构造,lambda,类和接口,但是有一点我不明白。而且,我已经看到了该线程Pass interface as parameter in Kotlin

我的问题是:用于构造JsonObjectRequest的第四个参数发生了什么?从我的角度来看,有一个lambda重写了一些与Response.Listener<JSONObject>相关的函数,但我找不到对该语法的任何引用。

最后,objectRequest具有以前的构造函数:

    public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
        Listener<JSONObject> listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                errorListener);
}

并且侦听器具有以下部分:

public class Response<T> {

/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
    /** Called when a response is received. */
    void onResponse(T response);
}

/** Callback interface for delivering error responses. */
public interface ErrorListener {
    /**
     * Callback method that an error has been occurred with the
     * provided error code and optional user-readable message.
     */
    void onErrorResponse(VolleyError error);
}

阅读此书后,我发现使用这种语法我们正在实现Listener接口,但我不明白为什么要使用lambda,因为在Listener中没有对其的引用,尤其是这意味着什么:

 Response.Listener<JSONObject> { response ->
            // Display the first 500 characters of the response string.
            Log.d("Debug","Response is: ${response.toString()} ")

        }

有人愿意解释这一点还是要指出一些与此语法相关的参考文献?

1 个答案:

答案 0 :(得分:2)

这是SAM-conversion。因为Response.Listener<JSONObject>是SAM接口(具有没有default实现的单个方法)并且是用Java定义的,所以可以编写

Response.Listener<JSONObject> /* lambda */

和lambda用作该方法的实现。即相当于

object : Response.Listener<JSONObject> {
    override fun onResponse(response: JSONObject) {
        Log.d("Debug","Response is: ${response.toString()} ")
    }
}