我们很高兴的宣布 Kotin 1.2 beta 版本发布了。此版本中,我们推出了一个重要的新功能 —— 多平台项目的实验性支持。此外,语言和标准库中现在已经具备了完整的功能,包括为 kotlin 1.2 所设计的所有新特性。希望大家可以积极给予我们反馈,根据反馈情况,我们会在 kotlin 1.2 最终的正式版发布之前继续完善和调整。
Kotlin 1.2 beta 版包含近期发布的 1.1.5 版本中的所有特性,与所有版本的 IntelliJ IDEA 兼容,从 2016.3 到 2017.3 以及 Android Studio 2.3 和 3.0。
关于 kotlin 1.2 beta 版完整的更新内容请到这里查看https://github.com/JetBrains/kotlin/blob/1.2-Beta/ChangeLog.md
多平台项目
多平台项目是 kotlin 1.2 中的一个新的实验特性,它允许你在 Kotlin 所支持的平台上复用代码,例如 JVM、JavaScript 和 Native。在一个多平台项目中,你可以将平台之间共享的代码放到一个公共模块中,并将平台相关的部分放到特定的平台模块中依赖。当你为一个特定的平台编译一个这样的项目的时候,会生成公共和特定于平台的不同代码。
多平台项目支持的一个关键特性是通过 expected 和 actual 声明,对特定于平台部分的公共代码进行依赖。 expexted 的声明通过指定一个 API 如(类、接口、注解、顶级声明等)来实现。actual 的声明要么是一个平台相关的 API 实现,要么是一个引用在外部库中的 API 现有实现的类型别名,如下图所示:
有关多平台项目的更多信息,请参阅文档
http://kotlinlang.org/docs/reference/multiplatform.html
如果你在声明之前已经尝试过这个特性,请注意你需要更新你的项目: header 和 impl 关键字已经被重新命名为 expected 和 actual 。要想自动更新你的代码,请在 IntelliJ IDEA 中使用 Analyze | Cleanup Code 完成。
语言和编译器
Array Literals in Annotations (注解中允许使用数组常量)
在 Kotlin 1.2 中,一个新的语言特性是在注解中对数组常量的支持。现在,我们不需要编写像@cacheconfig(cacheNames=array("books", "默认")) 这样的东西,您可以简单地使用一个文字表达式:
@CacheConfig(cacheNames = ["books", "default"])
这个特性已经在 Kotlin 1.2 的正式版中支持。在 1.2 测试版中,我们使语法更加一致,并允许使用数组常量和数组参数,也可以使用vararg参数:
@RequestMapping(value = ["value1", "value2"], path = ["path1", "path2"])
为了实现这一变化,我们决定对使用实参的语法和在常规方法调用以及注解中使用实参的语法进行一些调整。您可能会感到惊讶,但是在 Kotlin 1.1 中,当使用实参语法调用 vararg 方法时,可以将单个参数作为一个直接值传递:
使 strs 等于一个字符串 “abc” 有点不太直观,它还使我们在传递一个完整的数组时使用了扩展运算符作为一个实参 :
foo(strs = *arr)
我们很想把它变成 foo(strs=arr) ,但是为了兼容性,它需要一个渐进的迁移,所以在 1.2 中我们不推荐使用 foo(strs=“abc”) 。作为替换,您可以使用利差操作符和 arrayof 方法:
foo(x = *arrayOf("abc"))
我们计划实现一个编译器优化,以省略数组分配和在这样的调用中复制,请参考:https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FKT-20462
由于注解是一个更受约束的上下文,所以我们可以跳过迁移中的一个步骤,所以您可以简单地将值封装在一个数组文本中,而不需要扩展操作符:
更多信息请参见 YouTrack https://youtrack.jetbrains.com/issue/KT-20171。
lateinit 改进
我们添加了一个新的反射 API ,允许您检查一个 lateinit 变量是否已被初始化:
这是这个保留提议的部分 https://github.com/Kotlin/KEEP/pull/73/files, 剩下的部分(deinitialize 方法)已经被推迟,暂时推迟到1.3。
此外,现在可以在全局变量和局部变量上使用 lateinit 修饰符。例如,在初始化对象时,可以使用后者,并且在对象的属性之间有一个循环依赖关系(例如,作为构造函数参数传递给一个对象的 lambda 引用了另一个对象,该对象必须在以后定义):
请参阅 KEEP https://github.com/Kotlin/KEEP/blob/master/proposals/local-and-top-level-lateinit-vars.md 信息以获得更详细的信息
绑定调用引用改进
您现在可以在这样的表达式中省略 this::foo,它创建了一个绑定到这个成员的可调用引用。相反,您可以简单地编写 ::foo。以前,左侧的语法只能用于创建对顶级声明的可调用引用。要了解更多信息,请查看 YouTrack https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FKT-15667 。
类型推断的改进
Kotlin 编译器现在可以在类型推断中使用类型转换的信息。如果您调用的是返回类型参数 T 的泛型方法,并将返回值转换为特定类型的 Foo,那么编译器现在就会明白,该调用的 T 需要绑定到类型 Foo。这对于 Android 开发人员来说尤其重要,因为编译器现在可以正确地分析 Android AP I级别26中的 findViewById 调用:
val button = findViewById(R.id.button) as Button
因为在 Android API 26 中该方法已经被更改为 <T extends View> T findViewById(int id),Kotlin 1.1 无法在这种调用中推断出 T 的类型参数。
将警告作为错误提示
编译器现在提供了将所有警告视为错误的选项。在命令行上使用 -Werror,或者在 Gradle 中配置一下参数:
智能转换的改进
此外,lambda 中的智能转换现在允许在 lambda 之前修改的 var 变量。
枚举类中的嵌套类
现在已经弃用枚举类中的嵌套类了,作为修复,请将类标记为内部类。
标准库
分包的兼容性
Kotlin 标准库现在完全兼容 Java 9 模块系统,该系统禁止分割包(多个jar文件在同一个包中声明类)。为了支持这一点,我们已经创建了新的 artifacts : kotlin-stdlib-jdk7和 kotlin-stdlib-jdk8,它替换了旧的 kotlin-stdlib-jre7 和 kotlin-stdlib-jre8 。从Kotlin的角度来看,新的artifacts 中的声明是可见的,但是由于我们添加了特殊的编译器,所以在不同的包名下可以看到Java的不同的包名。因此,切换到新 artifacts 不需要对您的源代码进行任何更改。
为了确保与新模块系统的兼容性,我们所做的另一个更改是移除了 kotlin.reflect 中的弃用声明。如果您正在使用它们,您需要切换到 kotlin.reflect.full,它从 Kotlin 1.1 之后支持。
kotlin.math
kotlin.math 是 Kotlin 1.2 标准库中的一个新包,它允许您在跨平台代码中执行数学操作。在 1.2 测试版中,我们做了几个改进:
反双曲函数(asinh、acosh、atanh)现在得到了支持
在 JavaScript 中可以使用与浮点数(toBits,nextUp等)的二进制表示相关的函数
提高 JavaScript 的数学多填充精度
Pre-release notes
与 milestone releases 一样,我们不提供对新语言和库特性的向后兼容性保证。任何在 milestone releases 中引入的内容都要在最终1.2版本发布之前进行更改。当我们到达最终的 RC 时,由预发布版本生成的所有二进制文件将被编译器禁止 :您将被要求重新编译由1.2 Mx 或 1.2-beta 编译的所有内容。
如想使用稳定版本,请使用 1.1.X 版本
How to try it
在 Maven / Gradle : 添加 http://dl.bintray.com/kotlin/kotlin-eap-1.2作为仓库地址,使用 1.2.0-beta-31 作为编译器插件和标准库的版本号。
在 IntelliJ IDEA : 使用 Kotlin插件更新,然后在更新通道下拉列表中选择 “ Early Access Preview 1.2 ”,然后按下检查更新。可以从GitHub发布页面下载命令行编译器。
本次关于 Kotlin 1.2 beta 的更新说明就到这里。
ok,Let's Kotlin !