title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Upcoming Change: More Null-safety for Java |
2015-04-10 08:34:00 -0700 |
Andrey Breslav |
官方动态 |
false |
Have a nice Kotlin! |
我们结合零安全和 Java 互操作的战斗已经很久了:
- 我们开始处理所有的 Java 引用类型为可空,这太不方便了;
- 然后我们使用外部注释来指定可空性,创建了 KAnnotator,但是在版本控制时整个事情太脆弱了,有时候用户无法做到所需要的(特别是在继承时)。
- 在 M9 中,我们抛弃了注释(暂时),并介绍了平台类型,现在可以做任何事情,但是我们失去了(一些)类型安全;
- 在 M11 中,我们开始通过在 Java 可空性限制被违反的情况下发出警告来带回注释的有用方面。
现在,我们计划再做一个步骤,并结合平台类型使用注释,使带回尽可能多的类型安全。
细节描述于 这个规范文件 ,但总体思路如下:每当我们在 Java 中遇到可空性注释时,它们与它们之间的任何东西都不会发生冲突(如超类型中的重写声明),我们使用精确的类型。例如:
{% raw %}
{% endraw %}// Java
class Foo {
@Nullable String bar(@NotNull String baz) {...}
}
// Kotlin
foo.bar(nullableString ?: "default")?.length()
{% raw %}
{% endraw %}在最后一行,编译器要求我们处理需要非空值的bar()
的参数(所以我们使用“elvis”来提供一个默认值),结果为空(我们使用安全电话来保护 NPE)。如果我们忽略了任何一个,那么这将是一个编译错误。
似乎我们只是把我们以前放弃的东西(并对此感到高兴),但这不是这样。细节是相当涉及的,但简而言之,与我们之前介绍的平台类型之间的巨大差异在于,您不能有一种允许ArrayList< String>
和ArrayList< String?>
,当我们需要将我们从 Java 获得的东西重新提供给另一个 Java 方法时,它会导致需要痛苦的解决方法。是的,如果它不是泛型,几乎没有什么会改变,但泛型总是使编译器的作者的世界更亮了<img alt =“:)”class =“wp-smiley”data-recalc-dims =“1”src =“https://i2.wp.com/blog.jetbrains.com/kotlin/wp-includes/images/smilies/simple-smile.png?w=640&ssl=1”style =“height:1em; max -height:1em;“/>
另一件改变的是我们如何处理超越签名的冲突:
{% raw %}
{% endraw %}class Super {
String foo(String bar) { ... }
}
class Sub extends Super {
@Override
String foo(@NotNull String bar) { ... }
}
{% raw %}
{% endraw %}当我们将未注释的 Java 类型视为可空时,在上面的示例中,Kotlin 只能看到两个不相关的方法:foo(String?)
和foo(String)
具有不兼容的类型签名。
还有更多的可能的冲突来源,其中大多数在注释中实际上是不一致的,但是用户不断在他们的代码中使用它们,我们必须能够使用它们。所以,每当我们遇到冲突,我们只是坚持平台类型。 M11 中引入的警告保留在这种情况下,因此该代码不会以奇怪的方式打破,但是我们尽力让您了解可能的运行时问题。
请注意,在 Java 中,任何保留未注释的内容仍然包含平台类型,包括 Java 8 之前的所有通用类型参数。
Kotlin 编译器支持的实际注释集可能是可配置的,但无论如何,我们将支持以下内容:
- 我们一直使用的 org.jetbrains.annotation
- android.support.annotation
- javax.annotation(和来自 FindBugs 的)
- javax.validation.constraints
- lombok
- org.eclipse.jdt.annotation
- org.checkerframework.checker.nullness.qual
我们希望在 M12 之后,Java 的空值战斗将会结束。请继续关注,虽然<img alt =“:)”class =“wp-smiley”data-recalc-dims =“1”src =“https://i2.wp.com/blog.jetbrains.com/kotlin/wp -includes / images / smilies / simple-smile.png?w = 640&amp; ssl = 1“style =”height:1em; max-height:1em“