Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Studio将Java转换为Kotlin错误无法推断此参数的类型。请明确指定_Android_Kotlin - Fatal编程技术网

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

Android Studio将Java转换为Kotlin错误无法推断此参数的类型。请明确指定,android,kotlin,Android,Kotlin,我是Android开发新手(6个月前开始),我想从Java转到Kotlin。我已经将我的项目转换为Kotlin并修复了除一个问题以外的所有问题,但我不知道如何修复它 我试图检索一个JSONArray(如类JsonManager中所示),并通过方法调用在第二个名为DataDisplayPage的类中使用检索到的数据 我得到以下控制台错误,这些错误发生在第二个类的这一行:jManager.fetch_data{theJsonArray-> 无法推断此参数的类型。请显式指定它 类型不匹配:推断类型为(

我是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)
        }
    }
}
到目前为止,您还不能使用Kotlin中定义的接口。不过,您可以做一些事情来解决您的问题

  • 如果您用Java定义接口,SAM转换将开始工作,并且您当前的代码将在没有任何其他更改的情况下工作

  • 如果希望使用接口作为
    fetch_data
    方法的参数,并且希望使用Kotlin编写,则必须传入一个实现该接口的
    对象,这是一个稍微冗长、类似Java的解决方案:

    jmManager.fetch_data(object: OnTaskCompleted {
        override fun onTaskCompleted(theJsonArray: JSONArray) {
            // ...
        }
    })
    
  • 如果您想要一个很好的纯Kotlin解决方案,只需去掉接口,让
    fetch_data
    函数将函数作为其参数,而不是接口(同样,您在
    DataDisplayPage
    中的当前代码将处理此问题):

    fun-fetch_数据(回调:(JSONArray)->Unit){
    // ...
    侦听器?.onTaskCompleted(响应)
    回调(响应)
    // ...
    }
    


  • TIL:您可以在代码块中使用HTML的SO子集。我刚才也必须查找它:P而且,只有使用
    而不是缩进时,它才有效。谢谢,这对我帮助很大。我使用了建议2,并将阅读更多Kotlin文档,最终使用纯Kotlin。第三个解决方案是它被称为高阶函数。这是一个可以使用其他函数作为参数的函数。这里有文档记录:我认为阅读官方文档很重要。Kotlin的绝妙解决方案..干杯
    fun fetch_data(callback: (JSONArray) -> Unit) { 
        // ...
        listener?.onTaskCompleted(response)
        callback(response)
        // ...
    }