我是Android开发的新手(6个月前开始),并希望从Java迁移到Kotlin.我已将我的项目转换为Kotlin并修复了所有问题,但我无法弄清楚如何修复它.
我正在尝试检索JSONArray(如类JsonManager中所示)并通过方法调用在名为DataDisplayPage的第二个类中使用检索到的数据.
我收到以下控制台错误,这些错误发生在第二类的这一行:jManager.fetch_data{ theJsonArray ->.
无法推断此参数的类型.请明确说明.
类型不匹配:推断类型是(???) - > Unit但是预期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())
}
})
}
Run Code Online (Sandbox Code Playgroud)
第二类DataDisplayPage
class DataDisplayPage : AppCompatActivity()
fun onStartUp() {
val jManager = JsonManager()
jManager.fetch_data{ theJsonArray ->
val newData = DepData()
newData.setCellData(theJsonArray as JSONArray)
}
}
}
Run Code Online (Sandbox Code Playgroud)
zsm*_*b13 11
截至目前,您无法对Kotlin中定义的接口使用SAM转换.但是,您可以采取一些措施来解决问题.
如果您使用Java定义界面,SAM转换将开始工作,您当前的代码将无需任何其他更改即可运行.
如果你想使用一个接口作为fetch_data方法的参数,并且你希望它用Kotlin编写,那么你必须传入一个object实现它的接口,这是一个稍微冗长,类似于Java的解决方案:
jmManager.fetch_data(object: OnTaskCompleted {
override fun onTaskCompleted(theJsonArray: JSONArray) {
// ...
}
})
Run Code Online (Sandbox Code Playgroud)如果你想要一个不错的纯Kotlin解决方案,只需要摆脱界面,并让fetch_data函数将一个函数作为参数而不是接口(再次,你当前的代码DataDisplayPage将使用它):
fun fetch_data(callback: (JSONArray) -> Unit) {
// ...
listener?.onTaskCompleted(response)
callback(response)
// ...
}
| 归档时间: |
|
| 查看次数: |
4866 次 |
| 最近记录: |