是否计划向 Java 添加经过类型检查的可空类型?

Are there plans to add type-checked nullable types to Java?

相对于 Java,我最喜欢 Kotlin 的地方之一是您可以使用编译器来保证某些值永远不会为 null。 (Swift也有这个功能。)

 var foo: Thing 
 var bar: Thing?

就是那个例子,foo永远不能为空。我不必用防御性空检查来污染我的代码。另一方面,bar 可能为空。还有方便的语法来检查是否为 null 并使用它。

bar?.x             // bar.x, or null if bar is null
bar ?: defaultBar  // bar, or defaultBar if bar is null
if (bar != null) { 
    // bar is now Thing here, not Thing? (Assuming bar is a parameter or local variable.)
}

Java 最近发展得更快了,并且增加了功能,但我还没有听说过这方面的任何消息。是否考虑并拒绝了?或者有一天它会被添加到 Java?

Objects中有3 static methods class要求对象不为空抛出异常:

requireNonNull(T obj)

requireNonNull(T obj, String message)

requireNonNull(T obj, Supplier<String> messageSupplier)

不,Oracle 没有这样的计划。

Oracle 认为您可以使用第三方工具来执行此操作,例如 Checker Framework, NullAway,或内置于 IDE 中的支持,例如 IntelliJ 或 Eclipse。

Oracle 甚至不支持创建所有第三方工具都会使用的标准 @NonNull 注释。 Oracle let JSR 305,它会定义标准注释,过期并且没有恢复它。

就像@mernst 指出的那样,您可以使用Checker Framework。它会在编译时检查所有内容,您甚至可以添加自己的检查器。