Java ——> Kotlin 新概念——Implicit Receiver
自2011年 Kotlin 在 Jetbrains 立项之初,其负责人 Dmitry Jemerov 就称:"除 Scala 外,大多数语言并没有他们正在探寻的语言特性。" 同时他也指出了 Scala 的硬伤——蜗行牛步的编译速度。就此看来,圈内一直存疑的“Kotlin 对标的是 Java or Scala?”也便迎刃而解了,我一直不太认同“对标”这一说法,如果一个语言的诞生是要干翻前浪,那它的诞生就是毫无意义的。很显然在最初,Kt 团队只是在结合 Scala 创造新的语言特性,提高安全性,并兼容并简化 Java 便于推行。
那么在 Kt 如此火热的今天,已然衍生于了多种热门技术——Kotlin Multiplatform、Compose、协程...在这些技术的底层实现中,不可避免的一个 Kotlin 特性就是 Implicit Receiver。
眼熟吗?Java 的 this.?
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void printInfo() {
System.out.println("Name: " + this.name + ", Age: " + this.age);
}
}
data class Person(val name: String, val age: Int)
fun Person.greet() {
println("Hello, my name is $name and I am $age years old.")
}
fun main() {
val person = Person("Alice", 30)
person.greet()
}
以上两个例子,对比了“this”和 Implicit Receiver,我们不难看出 Kotlin 在一定程度上,简化了代码量,提高了可读性。
Kotlin:
在Kotlin中,扩展函数的定义不需要显式地接收一个对象作为参数,因为编译器会自动将调用该函数的对象作为隐式接收器。 例如:
fun Person.greet() { ... }
这里的greet函数会隐式地作用于Person对象。
Java:
在Java中,要引用当前对象的属性和方法,必须使用this关键字。 例如:
this.name
或
this.printInfo()
总的来说,Kotlin 的隐式接收器和 Java 的 this 关键字在概念、使用场景、语法和灵活性方面存在显著差异。Kotlin 的隐式接收器通过扩展函数为现有类型添加新方法时提供了更高的灵活性和简洁性,而 Java 的 this 关键字则主要用于引用当前对象的属性和方法。