将Java转换为Kotlin错误的Android Studio无法推断此参数的类型。请明确说明

时间:2017-05-29 17:32:24

标签: android kotlin

我是Android开发的新手(6个月前开始),并希望从Java迁移到Kotlin。我已将我的项目转换为Kotlin并修复了所有问题,但我无法弄清楚如何修复它。

我正在尝试检索JSONArray(如类JsonManager中所示),并通过方法调用在名为DataDisplayPage的第二个类中使用检索到的数据。

我收到以下控制台错误,这些错误发生在第二类的这一行:jManager.fetch_data{ theJsonArray ->

  

无法推断此参数的类型。请明确说明。

     

类型不匹配:推断类型是(???) - >单位但OnTaskCompleted是预期的

第一类JsonManager

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

}

第二类DataDisplayPage

class DataDisplayPage : AppCompatActivity()

    fun onStartUp() {

        val jManager = JsonManager()

        jManager.fetch_data{ theJsonArray  ->
            val newData = DepData()
            newData.setCellData(theJsonArray as JSONArray)
        }
    }
}

1 个答案:

答案 0 :(得分:10)

截至目前,您无法将SAM conversion用于Kotlin中定义的接口。但是,您可以采取一些措施来解决问题。

  1. 如果您使用Java定义界面,SAM转换将开始工作,您当前的代码将无需任何其他更改即可运行。

  2. 如果你想使用一个接口作为fetch_data方法的参数,并且你希望它在Kotlin中编写,那么你必须传入一个object实现它,这是一个稍微冗长,类似Java的解决方案:

    jmManager.fetch_data(object: OnTaskCompleted {
        override fun onTaskCompleted(theJsonArray: JSONArray) {
            // ...
        }
    })
    
  3. 如果你想要一个不错的纯Kotlin解决方案,只需摆脱界面,让fetch_data函数将函数作为参数而不是接口(同样,你当前的代码在{{ 1}}将用于此):

    DataDisplayPage