title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Kotlin 1.0 Beta 4 is Out! |
2015-12-22 14:25:00 -0800 |
Roman Belov |
官方动态 |
false |
Have a nice Kotlin! |
我们很高兴地宣布 Kotlin Beta 4,向 1.0 的另一个步骤!我们现在主要关注基础设施和面向未来的变化。完整的更改列表可用 这里 。更多细节如下。 现在是时候让你知道我们在 1.0 之前还要做什么。
我们已经推出了一个新的精确的依赖检测算法,使 Kotlin 的增量编译更快。它仍然是实验性的,但对我们的用例已经很好了。试试看:
设置 | 构建,执行,部署 | 编译器 | Kotlin 编译器 | 启用精确的增量编译(实验)
很快:同样的增量编译支持来到了 Gradle!敬请关注。 ## 语言一些亮点来自 完整的变更清单 。
由于修复了重载解析算法,Kotlin 现在将 SAM 转换的 Java 函数更像是成员(以前曾经像之前的扩展名一样)。这个修复很重要,因为编译器会以麻烦的方式解释许多情况。
不幸的是,至少有一个比较常见的情况已经破裂了。但修复很简单。现在编译器抱怨file.listFiles {it.name ==“...”}
。
原因很复杂:
- java.io.File 中有三个重载的列表文件
- 他们中的两个采取一个 SAM 接口,我们转换,以便他们可以采取一个 lambda
- 所以当传递无参数的 lambda 时,我们不知道应该选择哪一个
- 之前工作,因为选择旧的图书馆扩展功能(可追溯到 SAM 之前的时代)而不是 SAM 转换的成员。
解决方法很简单,只需指定参数,例如:
{% raw %}
{% endraw %}file.listFiles { it -> ... }
{% raw %}
{% endraw %}示例:在 Kotlin 中 String :: length`是一个属性,而不是一个函数,但是可以方便地在其中使用函数,例如,
{% raw %}
{% endraw %}val lengths = strs.map(String::length)
{% raw %}
{% endraw %}所以,我们现在允许这个。换句话说,每当一个 API 期望一个类型为(R)的功能 - > T
我们可以使用对R
的属性的引用,其返回类型是T
。
我们计划在未来的 Kotlin 版本中添加新功能,因此我们决定提前预留必要的关键字。我们了解到,人们无法预测未来的全部,但这是我们最好的猜测(没有详细的设计,为将来的功能可用,但我们会尽力使它们有用)
- yield 被保留为关键字
- 密封保留在“何时”之前
- typeof 被保留为关键字。在 JS 中,使用 jsTypeOf()
- 异步保留在“{”和“乐趣”之前
所以现在,而不是async {...}
,我们不得不说async(){...}
。我们知道这不是很干净,但是我们没有找到更好的选择。代码完成将自动插入()
。
代码清理*将帮助您迁移现有代码。
有关 Kotlin 如何翻译变体类型的问题,例如列表< Foo>应该是
List <在 Java 中扩展 Foo&gt;或简单地
List&lt; Foo&gt;`。细节细节,我们做了如下工作:
- 默认情况下,我们不会在返回类型中生成通配符,并且它们没有任何意义
- 当需要通配符时,可以使用类型注释来强制执行其存在:List <@JvmWildcard String>始终是 List <?在 Java 中扩展 String>
- 当我们需要摆脱一个通配符时,我们可以使用 @JvmSuppressWildcards(这可以在一个类型或包含它的任何声明中使用)
例子:
{% raw %}
{% endraw %}fun foo(l: List<String>) // in Java: List<String> (String is final)
fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String>
interface Open
fun bar(p: List<Open>) // in Java: List<? extends Open> (Open is not final)
@JvmSuppressWildcards
fun bar(p: List<Open>) // in Java: List<Open>
{% raw %}
{% endraw %}注意:这不仅涉及集合,而且涉及涉及声明位置差异的所有类型
我们正在清理标准库,这包括一些重新包装:
- kotlin.test 软件包已被移动到单独的 jar 文件:kotlin-test.jar。可以在 IDE 中快速修复以自动添加此依赖关系。
- 为了准备在标准库中重新排列包,我们已经创建了新的包,并将所有的功能复制到它们。旧功能保留二进制兼容性。 Kotlin 代码不需要迁移,代码清理可用于 Java 代码。
之后,我们计划从库中再次提取一个 JAR:它将包含很少使用的数组实用程序,所以我们希望将它们保留在主 JAR 之外,以减小其大小。
更多亮点:
Kotlin 的Int :: class
可能在不同的上下文中对应于 Java 的int.class
或Integer.class
(这是合理的)。为了方便用例,当需要两个特定的一个时,我们引入了两个属性:
- Int :: class.javaPrimitiveType 返回 Int.class
- Int :: class.javaObjectType 返回 Integer.class
此外,我们现在可以说如IntArray(5){it * 3}
,即创建初始化的基元数组。
JDK 的更新版本使得集合越来越不容忍。例如,这是什么 JavaDoc 关于java.util.Map.computeIfAbsent
:
如果指定的键尚未与值**(或映射到 null)**相关联,则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非为 null。
这些合同对于这种操作的原子属性是固有的,所以我们决定我们也必须满足它们,否则当 Kotlin 的扩展功能在无空闲的并发集合中运行时,我们将无法保证正确的行为。所以,我们将改变`getOrPut`和其他这样的函数的行为,以便它们将值`null`的值与该值不存在相同。 要更新您的代码,请遵循废弃警告中给出的建议。 ## IDE 中的新功能- 添加了用于重命名未解析引用的快速修复。在将某些代码粘贴到不同的上下文时,可以方便地调整符号的名称: