Error al crear interfaces de implementos de objects: la class no tiene un constructor

Recientemente intenté desarrollar una nueva aplicación en Kotlin sobre cómo get datos de cualquier website usando Volley. Me encuentro con un problema al crear una instancia de StringRequest y no sé cómo resolverlo.

Obtengo este error al crear el object Response.Listener<String> y Response.ErrorListener :

La class no tiene un constructor

El código está abajo:

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

Gracias de antemano.

Cuando crea un object que implementa una interfaz, las llaves () no son necesarias, ya que la interfaz no tiene un constructor. Por otro lado, cuando creas un object que amplía una class, se necesitan llaves. Por ejemplo:

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

Por lo tanto, debe quitar las llaves para Response.Listener y 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!") } }) 

Como Response.Listener y Response.ErrorListener son de tipo SAM definidos en Java y Kotlin admite conversiones de SAM , puede simplificar el código de esta manera:

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

Notas: La conversión SAM no es compatible con las interfaces definidas en Kotlin en este momento.

  • Cómo eludir NetworkOnMainThreadException en Kotlin
  • Redacción de request de networking con RX y Kotlin
  • ¿Es posible utilizar println como reference de function en Kotlin?
  • Kotlin: ¿cómo decidir entre "lateinit" y "variable anulable"?
  • Cómo acceder a los miembros de la class con el mismo nombre en la function de extensión en Android Kotlin
  • Interoperabilidad de Kotlin-JS: uso de construcciones de lenguaje
  • Kotlin recibe el tipo de cadena
  • Cómo fusionar 2 flujos separados, almacenar los datos rellenos y subscribirlos después de un time corto
  • ¿Una propiedad que cambia a de var a val una vez que se asigna un valor nulo?
  • Conmutación de Observables
  • Kotlin equivalente a "export pnetworkingeterminada" en JavaScript