我是 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)。不过,您可以采取一些措施来解决您的问题。
如果您在 Java 中定义接口(interface),SAM 转换将开始工作,并且您当前的代码无需任何其他更改即可工作。
如果你想使用一个接口(interface)作为
fetch_data
方法的参数,并且你希望它用 Kotlin 编写,你必须传入一个object
实现它,这是一个稍微冗长的类似 Java 的解决方案:jmManager.fetch_data(object: OnTaskCompleted { override fun onTaskCompleted(theJsonArray: JSONArray) { // ... } })
如果你想要一个好的纯 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/