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

Latest commit

 

History

History
201 lines (156 loc) · 7.58 KB

Kotlin M3 is Out!.md

File metadata and controls

201 lines (156 loc) · 7.58 KB
title date author tags keywords categories reward reward_title reward_wechat reward_alipay source_url translator translator_url
[译]Kotlin M3 is Out!
2012-09-20 08:03:00 -0700
Andrey Breslav
官方动态
false
Have a nice Kotlin!

上次我写了一个新的令人兴奋的 特征 在“即将到来的 KotlinM3”。今天,Kotlin M3 不是“即将到来”,就在这里。这篇文章概述了新的里程碑。 我们重新设计了** kotlin.jetbrains.org 。**目前,此页面的链接指向我们 wiki 中熟悉的文档,但随着时间的推移,这也会有所改善。

改进和错误修复

许多 我们关闭了近 400 个问题 在这个里程碑是 bug 修复和小的增强,使 Kotlin 更整洁和更亮。在类型参数推论算法中已经取得了巨大的进步。还没完成,但已经相当好了。 在 M3 中,我们开始剖析 IDE 并调整 IDE 的性能**以及编译器。这将是很多工作,但最终一切都会快速消耗很少的记忆。这次大部分改进与代码完成有关。

多重分配和数据类

这覆盖了 上周入场 。长篇小说,你可以写这样的东西:

{% raw %}

{% endraw %}
val map = hashMap("one" to 1, "two" to 2, "three" to 3)
for ((k, v) in map) {
    println("$k -> $v")
}

{% raw %}

{% endraw %}

并定义数据类:

{% raw %}

{% endraw %}
data class Point(val x: Int, val y: Int)

{% raw %}

{% endraw %}

这里 Point 自动获取 toString(),equals()/ hashCode()和组件函数,使您能够写入:

{% raw %}

{% endraw %}
val (x, y) = functionReturningPoint()

{% raw %}

{% endraw %}

看到更多的 上述职位 。 这些功能使我们能够不推荐使用元组。他们将在下一个里程碑中被完全删除,你可以 自动迁移代码 使用 IDE 插件。

{% raw %}

{% endraw %}

集合

静态 JVM 语言倾向于提出自己的集合库,因为 Java 集合不会使用这些语言的酷功能。所以我们得到非常酷的集合,不幸的是,不兼容的*,这使得我们在使用 Java API 时封装它们或复制。 Kotlin 有很多奇特的功能,但是我们渴望与 Java 平滑地进行互操作,事实证明,我们也可以吃这个蛋糕。认识 Kotlin 的系列: <img alt =“”class =“aligncenter size-full wp-image-665”data-recalc-dims =“1”sizes =“(max-width:723px)100vw,723px”src =“https:// i0 .wp.com / blog.jetbrains.com / kotlin / files / 2012/09 / Collections.png?resize = 640%2C335&amp; ssl = 1“srcset =”https://i0.wp.com/blog.jetbrains。 com / kotlin / files / 2012/09 / Collections.png?resize = 300%2C157&amp; ssl = 1 300w,https://i0.wp.com/blog.jetbrains.com/kotlin/files/2012/09/Collections .png?w = 723&amp; ssl = 1 723w“/>正如你所看到的,这里的基本结构非常像java.util给我们,但有一些重要的区别:

  • 存在区分可变集和只读集合的​​特征(“接口”)。
  • 只读特征(如 List 或 Set)是共变的(即可以将 List 分配给 List )。

好的旧的java.util.ArrayList仍然存在,但是 Kotlin 看起来像是继承自 Kotlin 的 MutableList,后者又继承了 List。这样,您可以获得集合的兼容性和良好的类型属性,例如能够传递 List ,其中 List 是预期的。 注意,因为旧名称(如列表或集合)现在意味着不同,您的一些代码将会中断。对于一个快速而肮脏的解决方案,您可以将所有列表更改为 MutableLists 等等,但是如果大部分数据都是只读的,则会更好。 另请注意:如果您的旧代码导入了类似java.util.Collection的内容,那么您将收到关于此导入的警告,并需要将其删除。

外部注释

Kotlin 通过整合使您的程序更安全 零安全 进入类型系统。由于 Java 不太在意这一点,我们需要通过断言 Java 返回的东西不使用'!!'运算符来保护它。

{% raw %}

{% endraw %}
if (file.getName()!!.endsWith(extension)) {...}

{% raw %}

{% endraw %}

(BTW,好的旧的 sure()函数已经从库中删除,你可以 自动迁移代码 。) 许多 Java 方法从不实际返回 null。人们使用注释来让 工具 知道它,但是如果我使用第三方库呢? 在 Kotlin M3 中,我们支持外部注释:即使您不控制其源代码,您也可以对其进行注释。这样做很容易 在 IDE 中 。 我们将创建一个自动化工具,从而强调**来自库代码的注释。在此之前,我们使用 IDE 手动添加注释。

本地功能和类

除了本地功能,Kotlin M3 支持本地类和对象声明:

{% raw %}

{% endraw %}
fun foo() {
  class Bar {...}
  val bars = ArrayList<Bar>()
  // ...
}

{% raw %}

{% endraw %}

请注意,要创建本地数据类,需要用方括号括起“数据”注释:

{% raw %}

{% endraw %}
fun foo() {
    [data] class Data(...)
    // ...
}

{% raw %}

{% endraw %}

Java 互操作性:枚举和注释

支持 Kotlin 的注释已大大改善。除此之外,Kotlin 的注释现在与 Java 注释完全兼容,可以在注释参数列表中使用枚举常量等等。 枚举现在也好多了:它们支持 valueOf(),name()和 ordinal(),并且可以很好地与 Java 一起使用。

REPL /脚本

我们在 Kotlin 的支持脚本方面做了一些工作。脚本支持相当初步,但您可以运行这样的操作:

{% raw %}

{% endraw %}
// tree.ktscript
import java.io.File
 
fun tree(dir: File, indent: String) {
    val files = dir.listFiles()!!
    for (file in files) {
        println(indent + file!!.getName())
        if (file.isDirectory()) {
            tree(file, indent + "  ")
        }
    }
}
 
tree(File("."), "")

{% raw %}

{% endraw %}

通过从命令行调用它:

{% raw %}

{% endraw %}
$ kotlinc/bin/kotlinc-jvm -script tree.ktscript
foo
  bar.txt
tree.ktscript

{% raw %}

{% endraw %}

Shebang “评论也受到支持。 脚本使我们足够接近 REPL ,但我们还没有。请用 网络演示 代替。

有一个尼斯 Kotlin!

新插件需要 IntelliJ IDEA 12,可以使用 EAP 构建 (此版本的 IntelliJ IDEA 尚未发布,有问题,例如 这个问题与 Android )。并且不要忘记更新你的 kotlin-runitme.jar(IDE 会提供你这样做)! 像往常一样,您的反馈非常受欢迎