Android Studio convirtiendo Java en error de Kotlin No se puede inferir un tipo para este parámetro. Por favor especifíquelo explícitamente

Soy nuevo en el desarrollo de Android (comenzó hace 6 meses) y me gustaría pasar de Java a Kotlin. He convertido mi proyecto en Kotlin y solucioné todos los problemas excepto uno y no puedo resolver cómo solucionarlo.

Estoy tratando de recuperar un JSONArray (como se ve en la class JsonManager) y utilizar los datos recuperados en una segunda class llamada DataDisplayPage a través de una llamada a un método.

Recibo los siguientes errores de console, que ocurren en esta línea de la segunda class: jManager.fetch_data{ theJsonArray -> .

No se puede inferir un tipo para este parámetro. Por favor especifíquelo explícitamente.

Tipo no coincidente: tipo inferido es (???) -> Unidad, pero se esperaba OnTaskCompleted

JsonManager de primera class

 interface OnTaskCompleted { fun onTaskCompleted(theJsonArray: JSONArray) } class JsonManager { var listener: OnTaskCompleted? = null init { Log.d("JsonManager", "Instance created") } fun fetch_data(callback : OnTaskCompleted) { listener = callback val url ="https://someURL" AndroidNetworking.get(url) .build() .getAsJSONArray(object : JSONArrayRequestListener { override fun onResponse(response: JSONArray) { listener?.onTaskCompleted(response) } override fun onError(anError: ANError) { Log.d("error", anError.toString()) } }) } 

Segunda class DataDisplayPage

 class DataDisplayPage : AppCompatActivity() fun onStartUp() { val jManager = JsonManager() jManager.fetch_data{ theJsonArray -> val newData = DepData() newData.setCellData(theJsonArray as JSONArray) } } } 

A partir de ahora, no puede usar la conversión SAM para las interfaces definidas en Kotlin. Sin embargo, hay un par de cosas que puedes hacer para resolver tu problema.

  1. Si define su interfaz en Java, la conversión de SAM comenzará a funcionar y su código actual funcionará sin ningún otro cambio.

  2. Si desea utilizar una interfaz como parámetro del método fetch_data , y desea que se escriba en Kotlin, tendrá que pasar un object que la implemente, que es una solución ligeramente verbosa, similar a Java:

     jmManager.fetch_data(object: OnTaskCompleted { override fun onTaskCompleted(theJsonArray: JSONArray) { // ... } }) 
  3. Si quieres una buena solución pura de Kotlin, simplemente deshazte de la interfaz y fetch_data function fetch_data tome una function como su parámetro en lugar de la interfaz (de nuevo, tu código actual en DataDisplayPage funcionará con esto):

     fun fetch_data(callback: (JSONArray) -> Unit) { // ... listener?.onTaskCompleted(response) callback(response) // ... } 

  • ¿Es posible inyectar en campo un adaptador de vista de reciclador con Dagger 2.11
  • Kotlin custom setter
  • El visor vertical personalizado no funciona con el oyente onClick en una vista secundaria
  • ¿Qué hace el operador de flecha ("->") en Kotlin?
  • Regresar la function de object de llamada de class interna
  • ¿Cómo se configura una construcción multiplataforma de Kotlin?
  • Cómo eliminar el desenfoque de la vista raíz en android
  • Kotlin: ¿cómo hacer una propiedad delegada por map con un nombre personalizado?
  • Encapsulando get el nombre del método en un método de ayuda
  • Referencia no resuelta: LinearLayoutManager / RecyclerView
  • Kotlin constructor con super class