我是
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())
- }
- })
- }
第二类DataDisplayPage
- class DataDisplayPage : AppCompatActivity()
- fun onStartUp() {
- val jManager = JsonManager()
- jManager.fetch_data{ theJsonArray ->
- val newData = DepData()
- newData.setCellData(theJsonArray as JSONArray)
- }
- }
- }
解决方法
截至目前,您不能将
SAM conversion用于Kotlin中定义的接口.但是,您可以采取一些措施来解决问题.
>如果您使用Java定义界面,SAM转换将开始工作,您当前的代码将无需任何其他更改即可运行.
>如果你想使用一个接口作为fetch_data方法的参数,并且你希望它在Kotlin中编写,你必须传入一个实现它的对象,这是一个稍微冗长,类似于Java的解决方案:
- jmManager.fetch_data(object: OnTaskCompleted {
- override fun onTaskCompleted(theJsonArray: JSONArray) {
- // ...
- }
- })
>如果你想要一个不错的纯Kotlin解决方案,只需要摆脱界面,并让fetch_data函数将一个函数作为参数而不是接口(再次,你在DataDisplayPage中的当前代码将使用它):
- fun fetch_data(callback: (JSONArray) -> Unit) {
- // ...
listener?.onTaskCompleted(response)- callback(response)
- // ...
- }