kotlin 和 java 的关系感觉就像 typescript 和 javascript 的关系。Kotlin 做法并不是革命式推翻项目中原有的老大地位,而是可以和老大融洽共处,让老大发现他好从而自身改变。
kotlin 扩展函数非常简单,只要把扩展类放置在函数名前面就搞定。
var title:String = "angular"
fun String.titlelastChar():Char = this.get(this.length - 1)
println(title.titlelastChar())
这里String
函数接受者,this
代表接受类型实例对象,看起来有点像 go 语言 struct
对interface
的实现。
扩展函数并不允许打破类封闭性,扩展函数中是无法访问到类私有或者受保护的成员。
扩展函数在 java 中也是可调用的使用的。
public static void main(String[] args) {
char c = StringUtilKt.titlelastChar("angluar");
System.out.println(c);
}
open class View{
open fun click() = println("clicked on view")
}
open class Button:View(){
override fun click() = println("clicked on button")
}
val view:View = View()
val btn:View = Button()
view.click()
btn.click()
在 OOP 的语言中子类重现父类方法是一件极为平常事。即便向上转型也会调用子类的方法。
clicked on view
clicked on button
但是扩展函数并不是类的一部分,我们做一个实验让基类View
和Button
都扩展了showOff
方法。
fun View.showOff() = println("call showOff of view")
fun Button.showOff() = println("call showOff of button")
val btn:View = Button()
btn.showOff()
call showOff of view
发现 button 向上转型调用时 View 的 showOff 方法而非自己本身的 showOff 方法。
网友评论