Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Latest commit

 

History

History
143 lines (104 loc) · 6.51 KB

Kotlin 1.0 Beta 4 is Out!.md

File metadata and controls

143 lines (104 loc) · 6.51 KB
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(){...}。我们知道这不是很干净,但是我们没有找到更好的选择。代码完成将自动插入()。 代码清理*将帮助您迁移现有代码。

Java 通配符

有关 Kotlin 如何翻译变体类型的问题,例如列表&lt; Foo&gt;应该是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.classInteger.class(这是合理的)。为了方便用例,当需要两个特定的一个时,我们引入了两个属性:

  • Int :: class.javaPrimitiveType 返回 Int.class
  • Int :: class.javaObjectType 返回 Integer.class

此外,我们现在可以说如IntArray(5){it * 3},即创建初始化的基元数组。

未来的变化:集合中的 null 的含义

JDK 的更新版本使得集合越来越不容忍。例如,这是什么 JavaDoc 关于java.util.Map.computeIfAbsent

  如果指定的键尚未与值**(或映射到 null)**相关联,则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非为 null。

这些合同对于这种操作的原子属性是固有的,所以我们决定我们也必须满足它们,否则当 Kotlin 的扩展功能在无空闲的并发集合中运行时,我们将无法保证正确的行为。所以,我们将改变`getOrPut`和其他这样的函数的行为,以便它们将值`null`的值与该值不存在相同。 要更新您的代码,请遵循废弃警告中给出的建议。 ## IDE 中的新功能
  • 添加了用于重命名未解析引用的快速修复。在将某些代码粘贴到不同的上下文时,可以方便地调整符号的名称: