我正在将一个最初用 Java 编写的 Android 应用程序转换为 Kotlin。 我很难理解以下错误消息:
Type mismatch. Required: MenuSlidingTabStrip.OnTabSelectedListener? Found: (Nothing, Nothing) → Boolean
这是发出错误信号的代码 fragment (在转换之前它工作得很好):
private var tabs: MenuSlidingTabStrip? = null //The Kotlinized class
tabs!!.setOnTabSelectedListner{ tab, category -> /*Type mismatch...*/
listView!!.post {
...
}
}
转换此 Java 代码后出现问题(在 MenuSlidingTabStrip 中找到):
public void setOnTabSelectedListner(OnTabSelectedListener listener) {
this.listener = listener;
}
public interface OnTabSelectedListener {
public void OnTabSelected(View tab, MenuCategory category);
}
Kotlin
fun setOnTabSelectedListner(listener: OnTabSelectedListener?) {
this.listener = listener
}
interface OnTabSelectedListener {
fun onTabSelected(tab: View?, category: MenuCategory?)
}
你能看出问题所在吗?您需要更多代码吗?
最佳答案
我建议您使用本地支持的 lambdas 作为:
// make `this.listener` look like lambda signature as well
fun setOnTabSelectedListner(listener: (tab: View?, category: MenuCategory?) -> Unit) {
this.listener = listener
}
tabs!!.setOnTabSelectedListner { tab, category ->
// ...
}
如果您仍想通过手动定义的接口(interface)使用 SAM 转换,请使用 fun
关键字标记接口(interface),如 Kotlin 1.4-M1 Release changelog 中所述。 (仅适用于 Kotlin 1.4):
fun interface OnTabSelectedListener {
fun onTabSelected(tab: View?, category: MenuCategory?)
}
// call that method like this:
tabs!!.setOnTabSelectedListner(OnTabSelectedListener { tab, category ->
// ...
})
如果您还没有切换到 Kotlin-1.4(仍处于 beta 状态),如果您不愿意使用 native 提供的 lambda 语法,则必须手动实例化匿名对象:
tabs!!.setOnTabSelectedListner(object : OnTabSelectedListener {
override fun onTabSelected(tab: View?, category: MenuCategory?) {
// ...
}
})
关于java - 将 Java 转换为 Kotlin : Type mismatch. 需要 : MenuSlidingTabStrip. OnTabSelectedListener?发现 : (Nothing, Nothing) → Boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63059867/