如何声明可兼容Lambda表达式的Kotlin监听器接口?
解决Kotlin单方法接口无法用Lambda调用的问题
嘿,这个问题我太熟啦!你现在的接口是普通的Kotlin接口,哪怕只有一个抽象方法,Kotlin也不会自动把它当成可被Lambda替代的类型——你需要把它声明为函数式接口(Functional Interface)才行。
步骤1:修改接口声明
给你的接口加上fun关键字,明确标记它是一个单抽象方法的函数式接口:
fun interface OnSomethingReadyListener { fun onSomethingReady() }
这个fun修饰符相当于告诉Kotlin:“这是一个只有核心抽象方法的接口,可以直接用Lambda表达式来实例化它”。
步骤2:验证Lambda调用
修改接口后,你原来的Lambda写法就能正常运行了:
something.addOnSomethingReadyListener { progressbar.visibility = View.GONE }
Kotlin会自动把这个Lambda转换成OnSomethingReadyListener的实例,完全替代了繁琐的匿名类写法。
补充小提示
- 函数式接口只能有一个抽象方法,如果接口里定义了多个抽象方法,就没法用
fun修饰,也不能用Lambda替代。 - 你可以在函数式接口里添加默认方法或者伴生对象的静态方法,这不影响Lambda的使用,比如:
fun interface OnSomethingReadyListener { fun onSomethingReady() // 允许添加带默认实现的方法 fun onSomethingFailed() { // 这里写默认逻辑 } }
这样就能完美满足你用Lambda替代匿名类的需求啦!
内容的提问来源于stack exchange,提问作者Sira Lam
相关产品推荐
相关产品推荐

