创建对象实现接口时出错:类没有构造函数



我今天刚刚尝试在 Kotlin 中开发一个新的应用程序,关于使用 Volley 从任何网站获取数据。我在创建StringRequest实例时遇到问题,我不知道如何解决。

创建对象Response.Listener<String>Response.ErrorListener时出现此错误:

该类没有构造函数

代码如下:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Btn.setOnClickListener {
val queue = Volley.newRequestQueue(this)
val url = "http://www.google.com"
val stringRequest = StringRequest(Request.Method.GET, url,
object:Response.Listener<String>() {
override  fun onResponse(response:String) {
// Display the first 500 characters of the response string.
textView.setText("Response is: " + response.substring(0, 500))
}
}, object:Response.ErrorListener() {
override fun onErrorResponse(error:VolleyError) {
textView.setText("That didn't work!")
}
})
queue.add(stringRequest)
}
}
}

提前谢谢你。

当您创建实现接口的对象时,不需要大括号(),因为接口没有构造函数。另一方面,当您创建扩展类的对象时,需要大括号。例如:

interface MyListener {
fun success()
}
abstract class MyAbstractClass {
abstract fun fail()
}
//Create an object which extends MyAbstractClass and implements MyListener
val impl = object: MyAbstractClass(), MyListener {
override fun success() { TODO() }
override fun fail() { TODO() }
}

因此,您需要删除Response.ListenerResponse.ErrorListener的大括号:

val stringRequest = StringRequest(Request.Method.GET, url,
object: Response.Listener<String> {
override fun onResponse(response:String) {
// Display the first 500 characters of the response string.
textView.setText("Response is: " + response.substring(0, 500))
}
}, object: Response.ErrorListener {
override fun onErrorResponse(error:VolleyError) {
textView.setText("That didn't work!")
}
})

由于Response.ListenerResponse.ErrorListener是 Java 中定义的 SAM 类型,并且 Kotlin 支持 SAM 转换,因此您可以通过以下方式简化代码:

val stringRequest = StringRequest(Request.Method.GET, url,
Response.Listener<String> {
response ->
// Display the first 500 characters of the response string.
textView.setText("Response is: " + response.substring(0, 500))
}, Response.ErrorListener {
error ->
textView.setText("That didn't work!")
})
//Or even
val stringRequest = StringRequest(Request.Method.GET, url,
Response.Listener<String> {
// Display the first 500 characters of the response string.
textView.setText("Response is: " + it.substring(0, 500))
}, Response.ErrorListener {
textView.setText("That didn't work!")
})

注意:目前 Kotlin 中定义的接口不支持 SAM 转换。

最新更新