创建对象实现接口时出错:该类没有构造函数
我今天刚刚尝试在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.Listener
和Response.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.Listener
和Response.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转换。