Kotlin编译总是假设java方法返回可空值,除非方法annotate @Nonnull

pzfprimi  于 2023-11-21  发布在  Kotlin
关注(0)|答案(2)|浏览(168)

如何让Kotlin编译总是假设java方法返回可空值,除非方法注解@ Nonvalues。是不是任何Kotlin编译参数都可以实现?
例如,getString方法返回null:

public class JavaClass {
  public String getString() {
    return null;
  }
}

字符串
当从Kotlin调用时,它可以直接调用getString而不进行空检查:

fun main() {
  val str = JavaClass().string
  str.length
}


我想让Kotlin编译强制处理getString返回一个可以为空的值,那么str必须在null检查后使用如下方法:

fun main() {
  val str = JavaClass().string
  str?.length
}

dgiusagp

dgiusagp1#

这是不可能的。引用Kotlin论坛上类似discussion的JetBrains团队成员的话:
平台类型不是,也不会总是可空的
同一个人还提到了Andrey Breslau的this talk,解释了这个决定。总而言之,这将在调用Java代码时引入大量的?.!!。当你想Assert泛型类型参数为非空时,这变得更加不方便。如果Java方法返回List<String>,如果它将所有Java类型都视为可空类型,则它将变为List<String?>?。尽管您可以使用!!Assert列表不为空,但您不能在没有未经检查的强制转换的情况下Assert列表中的String也为非空。
如果你真的想这样做,你唯一的选择就是编辑Java代码-用可空的注解来注解它。你可以使用@TypeQualifierDefaults来简化这个过程。
如果你只是想在将一个平台类型分配给一个不可空类型时发出一个警告/错误,请查看this post。你可以编写自己的IDE插件来实现这一点。

dffbzjpn

dffbzjpn2#

由于Kotlin编译器考虑了Java空性注解(如jsr305@Nullable),因此您可以使用此类注解来注解Java方法以获得所需的行为。

public class JavaClass {
  @CheckForNull
  public String getString() {
    return null;
  }
}

字符串
这可以通过package-info.java文件在包级别完成。

@CheckForNull
package mypackage;


请注意,最好将这个逻辑反过来:使用package-info将所有方法注解为返回非null,并仅指定可空的方法,就像上面的第一个代码示例一样。这将在java端和Kotlin端获得相同的空安全性,假设您使用可用的工具之一来强制执行这些注解。
(from baeldung

@NonNullApi
package mypackage;

相关问题