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 %}支持 Kotlin 的注释已大大改善。除此之外,Kotlin 的注释现在与 Java 注释完全兼容,可以在注释参数列表中使用枚举常量等等。 枚举现在也好多了:它们支持 valueOf(),name()和 ordinal(),并且可以很好地与 Java 一起使用。
我们在 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 ,但我们还没有。请用 网络演示 代替。
新插件需要 IntelliJ IDEA 12,可以使用 EAP 构建 (此版本的 IntelliJ IDEA 尚未发布,有问题,例如 这个问题与 Android )。并且不要忘记更新你的 kotlin-runitme.jar(IDE 会提供你这样做)! 像往常一样,您的反馈非常受欢迎!