【Kotlin】互操作之Java调用Kotlin避坑指南

📅 2026/7/1 3:44:36
【Kotlin】互操作之Java调用Kotlin避坑指南
前言Java 不能直接理解 Kotlin 语法顶层函数、伴生对象、data class、suspend、private 等Kotlin 会编译成特殊的 Java 结构Java 必须按编译后的规则调用。下面是精心整理的常用避坑速查清单一、顶层函数/顶层常量*.kt 文件内直接定义Kotlin 代码文件名FileUtil.ktfunprintLog(msg:String){}constvalVERSION2.1.0valdesc工具类Java 调用规则函数/普通属性文件名Kt作为类名调用const val编译期常量可直接静态访问FileUtilKt.printLog(test);StringvFileUtilKt.VERSION;StringdFileUtilKt.getDesc();约束不能直接FileUtil.printLog()必须带后缀Kt普通val在 Java 是getXXX()。二、companion object 伴生对象原始写法无注解classUser{companionobject{funcreate(){}constvalMAX100}}Java 调用User.Companion.create();intmaxUser.MAX;规范优化添加JvmStatic消除 Companioncompanionobject{JvmStaticfuncreate(){}constvalMAX100}Java 简洁调用User.create();约束不加JvmStatic必须写.Companionconst val不受影响。三、带默认值的函数参数无注解Java 强制传全量参数funshow(name:String,age:Int18){}Java 只能完整传参show(Tom,18);// show(Tom); 编译报错规范优化JvmOverloads生成多重载方法JvmOverloadsfunshow(name:String,age:Int18){}Java 两种调用都支持show(Tom);show(Tom,20);约束Java 原生不识别 Kotlin 默认参数不加注解无法省略参数。四、单例 object 类KotlinobjectHttpManager{funrequest(){}}Java 调用HttpManager.INSTANCE.request();约束没有静态方法必须通过内置INSTANCE对象访问如需静态调用函数上加JvmStaticobjectHttpManager{JvmStaticfunrequest(){}}// JavaHttpManager.request();五、Kotlin 属性 val / varKotlinclassBook{valid:Long1L// 只读vartitle:String// 可读可写}Java 调用自动生成 getter / setterBookbooknewBook();longidbook.getId();Stringtbook.getTitle();book.setTitle(Kotlin实战);约束Java 不能直接.id/.title必须使用 getter/setter。六、internal 修饰符模块内可见KotlininternalfuninnerFunc(){}internalvalcode200约束Java 完全无法访问编译直接报错跨模块/Java 代码不要用internal。七、空安全类型关键坑点Kotlin 不可空String禁止nullfunsetName(name:String){}Java 可强行传入null运行抛出空指针setName(null);// 运行崩溃Kotlin 可空String?funsetNick(nick:String?){}Java 传 null 安全setNick(null);规范对外提供给 Java 调用的接口不确定入参是否为空时统一声明可空?。八、suspend 挂起函数Java 无法直接调用KotlinsuspendfunfetchData():String{return}约束Java 不存在协程上下文直接调用编译报错。规范方案封装普通函数使用协程调度器包装提供 Java 可用回调接口funfetchDataJava(callback:(String)-Unit){CoroutineScope(Dispatchers.IO).launch{valresfetchData()callback(res)}}Java 调用fetchDataJava(result-{System.out.println(result);returnUnit.INSTANCE;});九、高阶函数 / Lambda 参数KotlinfunlistenEvent(block:(Int)-Unit){}Java 调用规范使用Function1返回值必须携带Unit.INSTANCElistenEvent(num-{System.out.println(num);returnUnit.INSTANCE;});十、data class 数据类KotlindataclassStudent(valname:String,valage:Int)Java 使用构造正常 new获取属性推荐 getter不推荐 component 组件函数StudentsnewStudent(Jack,16);Stringnames.getName();// 推荐intages.getAge();// s.component1() 不推荐可读性差十一、常用注解速记Java 适配专用注解作用场景效果JvmStaticcompanion object / object生成静态方法Java 无需写 Companion/INSTANCEJvmOverloads带默认参数函数Java 生成多个重载支持省略参数JvmFieldval/var 属性Java 可直接访问字段不用 getterJvmName顶层文件修改 Java 生成的类名去掉 Kt 后缀十二、核心约束总览一句话总结顶层函数带Kt后缀伴生/单例不加JvmStatic必须写 Companion / INSTANCEJava 不支持默认参数、suspend、internalKotlin 属性在 Java 只能通过 getter/setterJava 可传 null 破坏 Kotlin 非空校验线上易空指针Lambda 需要返回Unit.INSTANCE。