2017-08-26 166 views
-1

我今天刚刚尝试在Kotlin中开发一个关于使用Volley从任何网站获取数据的新应用程序。创建StringRequest实例时遇到问题,我不知道如何解决该问题。创建对象实现接口时出错:该类没有构造函数

类没有构造

的代码如下:

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) 
     } 
    } 
} 

感谢您在

我创建对象Response.Listener<String>Response.ErrorListener时出现此错误提前。

回答

1

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

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 type和科特林支持SAM conversions,您可以简化代码通过这种方式:

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转换。

+0

非常感谢你baka –

+0

欢迎:) – BakaWaii

相关问题