android开发kotlin顶级函数和拓展函数的实现原理
android开发kotlin顶级函数和拓展函数的实现原理
//我们编写的源代码在MainActivity.kt下面,如下:
fun topTest(){
print("123")
}
fun MainActivity.extTest(){
print("456")
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
suyf()
extTest()
}
}
//经过编译器处理后的代码等价如下java代码MainActivity.java,如下:
public final class MainActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(C0749R.layout.activity_main);
MainActivityKt.topTest();//顶级函数本质就是static函数 ,编译器帮我们自动添加了MainActivityKt.
MainActivityKt.extTest(this);//拓展函数本质上就是static函数,编译器帮我们自动添加了MainActivityKt.和this参数
}
}
//另外生成了一个Kt结尾的MainActivityKt.java类,用于存放顶级函数和拓展函数,编译时帮我们在调用处添加了MainActivityKt.前缀。
public final class MainActivityKt {
public static final void topTest() {
System.out.print((Object) "123");
}
public static final void extTest(MainActivity extTest) { //编译器帮我们自动添加了一个类型为拓展类的参数
Intrinsics.checkNotNullParameter(extTest, "$this$extTest"); //这个就是判断?非空语法的实现,无非就是判空检查一下
System.out.print((Object) "456");
}
}
//结论:kotlin里的顶级函数本质就是java的static函数;拓展函数本质上也是static函数,另外拓展函数会自动多添加了类型为拓展类的参数,调用时传递了this进来。
//这些细节都是编译器在编译过程帮我们自动处理了,简直就是隐藏了太多细节了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库