如何让Kotlin默认将Java方法返回值视为可空,除非标注@NonNull?
解决方案:使用
-Xjsr305=strict编译参数 可以通过Kotlin编译器的-Xjsr305=strict参数实现你的需求:该参数会强制编译器将未标注空注解的Java方法返回值默认视为可空类型,仅当Java方法标注了@NonNull(或兼容的JSR-305注解如@Nonnull)时,才会被识别为非空类型。
效果验证
开启该参数后,你的Kotlin调用代码会发生以下变化:
- 原无空检查代码会触发编译报错:
fun main() { val str = JavaClass().string str.length // 编译错误:无法在可空类型String?上直接调用length } - 必须修改为带空检查的写法(符合你的预期):
fun main() { val str = JavaClass().string str?.length // 安全调用,编译通过 }
配置方式
根据你的构建工具,添加该编译参数:
Gradle(Kotlin DSL)
tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs += "-Xjsr305=strict" } }
Gradle(Groovy DSL)
tasks.withType(KotlinCompile) { kotlinOptions { freeCompilerArgs += '-Xjsr305=strict' } }
Maven
在kotlin-maven-plugin的配置中添加:
<configuration> <args> <arg>-Xjsr305=strict</arg> </args> </configuration>
补充说明
- 该参数支持所有常见的非空注解,包括JSR-305的
javax.annotation.Nonnull、Android的androidx.annotation.NonNull、Guava的com.google.common.annotations.NonNull等。 - 如果需要更温和的模式,可以使用
-Xjsr305=warn:此时未标注的Java方法返回值仍视为非空,但编译器会给出警告提示你可能存在空安全风险。
内容的提问来源于stack exchange,提问作者ChenRenJie
相关产品推荐
相关产品推荐

