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

Latest commit

 

History

History
350 lines (252 loc) · 10.9 KB

M6.2 Available.md

File metadata and controls

350 lines (252 loc) · 10.9 KB
title date author tags keywords categories reward reward_title reward_wechat reward_alipay source_url translator translator_url
[译]M6.2 Available
2013-12-06 07:55:00 -0800
Hadi Hariri
官方动态
false
Have a nice Kotlin!

今天我们发布了 Kotlin M6.2,它带来了一些有趣和重要的功能。新发布 IntelliJ IDEA 13 现在也受到支持。让我们来看看。

{% raw %}

{% endraw %}

语言增强

语言有一些期待已久和重要的变化。

尾呼叫优化

功能编程的所有粉丝的好消息:Kotlin 现在支持 尾调用优化 (TCO)。这意味着我们现在可以在功能性样式中编写代码,而不会冒出调用堆栈的风险。例如,以下是迭代器的左折叠可能是:

{% raw %}

{% endraw %}
tailRecursive
fun Iterator.foldl(acc : A, f : (e : T, acc : A) -> A) : A =
        if (!hasNext()) acc
        else foldl(f(next(), acc), f)

{% raw %}

{% endraw %}

请注意,该功能是使用[tailRecursive]注释**:当您希望优化尾呼叫时,这是强制性的。 我们不以静默方式执行 TCO,原因有二:

  • 调试。由于尾调用优化的函数不会进行实际的递归调用,所以调试器不会显示代表递归的任何堆栈帧,您将无法在先前的递归级别等上检查局部变量。因此,我们认为最不令人惊讶的方式这是在代码中明确的。
  • 安全。我们都知道一个关于代码的有趣的事情:它通常不会做它似乎在做什么😉与尾部呼叫相同:通常,一个呼叫看起来好像是一个尾巴呼叫,但事实上它不是。这意味着不能进行优化,性能会受到影响。使用[tailRecursive]注释,编译器知道哪些调用必须可以优化,并在出错时发出警告。

我们希望以功能为导向的图书馆 funKTionale 将受益于此功能,以及 Kotlin 的标准库。 谢谢 谢尔盖·马什科夫 为实现这一目标而作出的贡献。

常数表达式

如你所知,Kotlin 对类型非常严格:即使数字类型也不会隐含地强制执行。实现我们的方法是以同样的方式定义所有类型(如类),并避免 Java 有时会出现奇怪的工件。幸运的是,我们可以通过不断的表达来清除智能的大部分小小的不便。现在这个工作已经完成了,你可以这样做:

{% raw %}

{% endraw %}
val x: Long = -1

{% raw %}

{% endraw %}

要么

{% raw %}

{% endraw %}
val b: Byte = -1

{% raw %}

{% endraw %}

事实上,发生什么事情是,编译器会计算右侧常量表达式的值,检查,它符合预期类型(Long 或 Byte)的范围,并转换常量。非常量不会发生同样的事情,因为它们不能被检查。 此外,编译器在存在算术溢出时会警告您:

{% raw %}

{% endraw %}
val monthInMilliseconds = 1000 * 60 * 60 * 24 * 30 // WARNING

{% raw %}

{% endraw %}

这里的结果超出了 Int 类型的范围,编译器会向您发出警告。您可以通过使第一个数字 Long 来修复溢出:

{% raw %}

{% endraw %}
val monthInMillisecondsL = 1000.toLong() * 60 * 60 * 24 * 30 // OK

{% raw %}

{% endraw %}

但是,是的,太好了,太久了。我们现在支持熟悉的“L”后缀的数字:

{% raw %}

{% endraw %}
val monthInMilliseconds = 1000L * 60 * 60 * 24 * 30 // OK

{% raw %}

{% endraw %}

请注意,Longs 的“l”后缀,在许多字体中看起来非常像“1”是臭名昭着的,是不允许的。 同样,浮标的“F”后缀也是如此。由于“f”不像任何数字,总体看起来更加愉快,不会被禁止。 <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 %}
println(0.1 < 0.1f) // prints "true"

{% raw %}

{% endraw %}

它与这些十进制数字的二进制性质有很大关系,转换无损的情况对人类看起来不直观。因此,我们不会自动转换浮点值。默认情况下使用 Double,如果你想要一个 float,说明如此:

{% raw %}

{% endraw %}
val fl: Float = 1.0f

{% raw %}

{% endraw %}

<span style =“color:#000000; font-size:1.8em; line-height:1.5em”> Java 互操作性

可变性注释

你记得 Kotlin 的收藏有 只读接口 。如何揭示集合的 Java 库呢?随着着名的 @ Nullable / @ NotNull,Kotlin 现在提供注释来标记 Java 集合*@ReadOnly@Mutable。* 给出以下 Java 代码

{% raw %}

{% endraw %}
public List<EMail> activeEmails() {
    ...
}

{% raw %}

{% endraw %}

当从 Kotlin 调用它时,返回值为 List ,Kotlin 将其视为 MutableList*。我们现在可以使用*@ReadOnly*注释来装饰该方法,以便列表不能通过引用进行突变:

{% raw %}

{% endraw %}
@ReadOnly
public List<EMail> activeEmails() {
   ...
}

{% raw %}

{% endraw %}

这意味着我们不能再像以前那样调用其中的add()

{% raw %}

image

{% endraw %}

当涉及到参数时,我们可以做同样的事情。采取以下 Java 方法

{% raw %}

{% endraw %}
void processEmails(List<EMail> emails) {
    ...
}

{% raw %}

{% endraw %}

在 Kotlin,这将被代表

{% raw %}

{% endraw %}
fun processEmails(emails: List<EMail>)

{% raw %}

{% endraw %}

这可以变成

{% raw %}

{% endraw %}
fun processEmails(emails: MutableList<EMail>)

{% raw %}

{% endraw %}

通过使用*@Mutable*注释原始的 Java 代码

{% raw %}

{% endraw %}
void processEmails(@Mutable List<EMail> emails) {
    ...
}

{% raw %}

{% endraw %}

顺便说一下,这些注释也为您的 Java 代码提供了优秀的文档。

Kotlin 对 Java 可空类型的了解

编译器现在在 Java 字节码中发出*@Nullable@NotNull*注释。这允许 IntelliJ IDEA 在从 Java 调用 Kotlin 代码时使用这些并警告可空性违规。 例如

{% raw %}

{% endraw %}
class Customer {
   fun checkSocialSecurity(accountNumber: String) { ... }
}

{% raw %}

{% endraw %}

当从 Java 调用时

{% raw %}

{% endraw %}
Customer customer = new Customer();
customer.checkSocialSecurity(null); // WARNING

{% raw %}

{% endraw %}

会引起警告。

Android SDK

我们现在为整个 Android SDK 提供注释,使 Android 项目的工作变得更加轻松和安全。

Java 到 Kotlin 转换器

最后但并非最不重要的一点,虽然与 Java Interop 不完全相关,但我们还将 Java 改进为 Kotlin 转换器,提供更清晰的代码和更好的格式化。

JavaScript 改进

我们将继续改进 JavaScript 编译器的支持。现在,您可以通过设置中的Kotlin 编译器页面配置是否生成源代码图,以及您希望将其放在哪里。 偏好设置

{% raw %}

image

{% endraw %}

此外,您可以为生成的 Kotlin JavaScript 代码指定输出文件前缀和后缀。 我们还修复了一些 JavaScript 相关的问题,包括

  • 功能的默认参数现在已修复
  • 支持超级构造函数调用
  • 支持特征中的类对象

蚂蚁支持改进

Java 编译器

使用typeDef导入任务而不是使用taskDef,使我们不仅可以访问现有的“em”kotlinc&gt;任务,而且新的与<kotlin /&gt;* Ant 的任务,它允许在使用 Java 编译器任务*&lt; javac&gt;时使用后者中定义的src*属性来编译 Kotlin 文件。

JavaScript 编译器

您也可以使用 Ant 编译 Kotlin 到 JavaScript。有一个新的任务*&lt; kotlin2js&gt;其中给出了src输出*属性,将把 Kotlin 编译成 JavaScript。还提供了各种附加选项,类似于 IDE 中启用源映射,生成文件的前缀和后缀等的其他选项。

IDE 增强功能

我们现在可以向编译器提供 IntelliJ IDEA 附加命令行参数,以及是否要生成警告

{% raw %}

image

{% endraw %}

此外,还增强了/更新了其他一些 IDE 功能:

  • 智能完成:虽然只是开始,我们正在努力在 Kotlin 中提供更智能的完成,这些都是我们已经为 Java 提供的。

{% raw %}

image

{% endraw %}
  • 查找用途:改进的性能。能够查找本地和私有声明,支持值/类型参数和属性 getter / setter,以及一些错误修复。
  • 更改签名重构:现在支持函数层次结构。
  • 重命名重构:修复从 Java 代码重命名 Kotlin 类和函数以及重写 Kotlin 基本函数时出现的问题。

虽然我们只介绍了这个版本的一些改进,但是已经有一个 另外 120 个问题 已解决包括功能和错误修复,因为 里程碑 6.1。 ##

下载

如果您使用 IntelliJ 13,您已经有 Kotlin M6.2 开箱即用。否则,您可以从中下载编译器 发行页面IntelliJ IDEA 存储库中的插件