我正在研究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()} ")
}
有人愿意解释这一点还是要指出一些与此语法相关的参考文献?
答案 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()} ")
}
}