Android Studio将Java转换为Kotlin错误无法推断此参数的类型。 请明确指定
我是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()) } }) }
第二类DataDisplayPage
class DataDisplayPage : AppCompatActivity() fun onStartUp() { val jManager = JsonManager() jManager.fetch_data{ theJsonArray -> val newData = DepData() newData.setCellData(theJsonArray as JSONArray) } } }
截至目前,您不能使用Kotlin中定义的接口使用SAM转换 。 有几件事情可以解决你的问题。
-
如果你在Java中定义你的接口,SAM转换将开始工作,而你的当前代码将无任何其他的改变。
-
如果你想使用一个接口作为
fetch_data
方法的参数,并且你希望它被写入到Kotlin中,那么你必须传入一个实现它的object
,这是一个类似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) // ... }
- Kotlin lateinit属性,NPE危险?
- 使用Kotlin创建一个新的目录,Mkdir()不起作用
- Android如何在Kotlin中以编程方式设置多个重力值?
- 处理程序()postDelay无法访问此Kotlin代码,如何解决它?
- FragmentManager在Kotlin中抛出IllegalArgumentException
- ClassCastException:android.inputmethodservice.KeyboardView无法转换为com.support.mukhtar.simplekeyboard.CustomKeyboardView android
- 在可能为空的接收器类型的数组列表中,只允许安全或非空的确定的呼叫
- 如何将Gson类型适配器转换为Klaxon类型适配器
- 是否有可能在Dagger 2.11中注入Recycler View适配器