Android Studio将Java转换为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) } } } 

截至目前,您不能使用Kotlin中定义的接口使用SAM转换 。 有几件事情可以解决你的问题。

  1. 如果你在Java中定义你的接口,SAM转换将开始工作,而你的当前代码将无任何其他的改变。

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

     jmManager.fetch_data(object: OnTaskCompleted { override fun onTaskCompleted(theJsonArray: JSONArray) { // ... } }) 
  3. 如果你想要一个不错的纯Kotlin解决方案,只需要删除接口,并且让fetch_data函数以函数作为参数而不是接口(同样, DataDisplayPage的当前代码也可以工作):

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