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

标签 android kotlin

我是 Android 开发新手(6 个月前开始),想从 Java 迁移到 Kotlin。我已将我的项目转换为 Kotlin 并修复了除一个之外的所有问题,但我不知道如何解决它。

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

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

Cannot infer a type for this parameter. Please specify it explicitly.

Type mismatch: inferred type is (???) -> Unit but OnTaskCompleted was expected

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

}

二等数据显示页面

class DataDisplayPage : AppCompatActivity()

    fun onStartUp() {

        val jManager = JsonManager()

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

最佳答案

截至目前,您无法使用 SAM conversion用于 Kotlin 中定义的接口(interface)。不过,您可以采取一些措施来解决您的问题。

  1. 如果您在 Java 中定义接口(interface),SAM 转换将开始工作,并且您当前的代码无需任何其他更改即可工作。

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

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

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

关于Android Studio 将 Java 转换为 Kotlin 错误无法推断此参数的类型。请明确指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247827/

相关文章:

Android:过滤特定 Uri 模式的 Intent

android - 如何从android中的 native 电话簿获取联系人

kotlin - 如果需要 bool 和可空检查,如何简化此kotlin代码?

kotlin - 我可以省略在 Kotlin 中不使用的接口(interface)方法吗?

java - 如何在后台服务中检测 View 之外的触摸事件?

java - 找不到处理 Intent { act=android.settings.LOCALE_SETTINGS } 的 Activity

android - adb screencap 创建损坏的文件

arrays - 如何在Kotlin中使ByteArray保持不变

android - Kotlin Android 扩展和保留 fragment

kotlin - 了解协程中的 cancelParent 函数