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

我今天刚刚尝试在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转换。