2017-08-26 37 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

相關問題