【问题标题】:Android Studio converting Java to Kotlin error Cannot infer a type for this parameter. Please specify it explicitlyAndroid Studio 将 Java 转换为 Kotlin 错误无法推断此参数的类型。请明确指定
【发布时间】:2017-10-30 01:52:06
【问题描述】:

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

}

二等数据显示页面

class DataDisplayPage : AppCompatActivity()

    fun onStartUp() {

        val jManager = JsonManager()

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

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    到目前为止,您不能将 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 函数将函数作为其参数而不是接口(同样,DataDisplayPage 中的当前代码将适用于此):

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

    【讨论】:

    • TIL:您可以在代码块内使用 HTML 的 SO 子集。 ?
    • 我刚才也必须查一下 :P 另外,它只有在你使用 <pre><code> 而不是缩进时才有效。
    • 谢谢,这对我帮助很大。我选择了建议 #2,并且会阅读更多 Kotlin 文档以最终成为纯 Kotlin。
    • 第三种解法称为高阶函数。它是可以使用其他函数作为参数的函数。记录在这里:kotlinlang.org/docs/reference/lambdas.html我认为阅读官方文档很重要。
    • Kotlin 的绝妙解决方案.. 干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多