在 Kotlin 的 lambda 编程中有说过对于单个抽象方法的接口可以用 lambda 进行简写,这种特殊的接口俗称函数式接口,在实际项目里用起来也是极为简便,最典型的就是 setOnClickListener 方法。
今天在写接口时想到,如果我写一个仅有一个抽象方法的接口,应该也能用 lambda 表示,就像下面这样,
interface OnDialogOpListener {
fun onConfirm(view: View)
}
但在调用 set 方法时,我却只能用 object 匿名内部类的形式实现,IDE 并没有提示我可以用 lambda,我强行用的话还报错了。可见普通方式的声明定义不太行。后来我搜到了这篇文章 https://www.kotlincn.net/docs/reference/fun-interfaces.html ,介绍 kotlin 的函数式接口。不同点在于在 interface 的前面又增加了 fun 修饰,表明这是个函数式接口,这点和 OnClickListener 接口是不同的,后者本身用 Java 实现,所以并不能看出特殊,而用 fun 修饰接口,才是声明函数是接口规范的做法。
fun interface OnDialogOpListener {
fun onConfirm(view: View)
}
像上面这样就是一个标准的函数式接口了,这下就能用 lambda 来表示了。不过要注意的是,当接口有多个抽象方法时,fun 修饰你想用也用不上,因为这只能限定在单抽象方法的接口上。
嗯,又学到了一点。
网友评论