您现在的位置是:首页 >其他 >Kotlin 1.7.0 的新特性网站首页其他
Kotlin 1.7.0 的新特性
1、内联类的内联值可以通过委托来实现
如果你想要为一个值或类实例创建一个轻量级包装器,你需要手动实现所有接口方法。通过委托进行实现可以解决这个问题,但在1.7.0之前,它在内联类中无法工作。这个限制已经被移除了,所以现在你可以创建轻量级包装器,在大多数情况下不需要分配内存。
interface Bar {
fun foo() = "foo"
}
@JvmInline
value class BarWrapper(val bar: Bar): Bar by bar
fun main() {
val bw = BarWrapper(object: Bar {})
println(bw.foo())
}
2、下划线操作符用于类型参数
Kotlin 1.7.0为类型参数引入了下划线操作符_。当指定了其他类型时,可以使用它自动推断类型参数:
abstract class SomeClass<T> {
abstract fun execute(): T
}
class SomeImplementation : SomeClass<String>() {
override fun execute(): String = "Test"
}
class OtherImplementation : SomeClass<Int>() {
override fun execute(): Int = 42
}
object Runner {
inline fun <reified S: SomeClass<T>, T> run(): T {
return S::class.java.getDeclaredConstructor().newInstance().execute()
}
}
fun main() {
// T is inferred as String because SomeImplementation derives from SomeClass<String>
val s = Runner.run<SomeImplementation, _>()
assert(s == "Test")
// T is inferred as Int because OtherImplementation derives from SomeClass<Int>
val n = Runner.run<OtherImplementation, _>()
assert(n == 42)
}
可以在变量列表中的任何位置使用下划线操作符来推断类型参数。
3、稳定版构建器推断
构建器推断是一种特殊类型的类型推断,在调用泛型构建器函数时非常有用。它帮助编译器使用lambda参数内其他调用的类型信息推断调用的类型参数。
从1.7.0开始,如果常规类型推断在没有指定-Xenable-builder-inference编译器选项(在1.6.0中引入)的情况下无法获得关于类型的足够信息,则构建器推断将自动激活。
Learn how to write custom generic builders.
4、稳定版选择加入要求
从1.7.0版本开始,Kotlin的Opt-in需求已经稳定,并且不需要额外的编译器配置。
在1.7.0版本之前,Opt-in特性本身需要使用参数-opt-in=kotlin.RequiresOptIn来避免警告。现在已不再需要这样做;然而,您仍然可以使用编译器参数-opt-in来选择其他注释进行Opt-in,针对整个模块。
5、稳定版绝对不可空类型
在 Kotlin 1.7.0 中,明确非空类型已经被提升为稳定特性。它们在扩展泛型 Java 类和接口时提供了更好的互操作性。
可以使用新的语法 T & Any,在使用类型参数时将其标记为明确非空。这种语法形式来自交集类型的表示法,现在被限制为具有可空上界的类型参数在 & 的左侧和非空的 Any 在右侧的形式:
fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y
fun main() {
// OK
elvisLike<String>("", "").length
// Error: 'null' cannot be a value of a non-null type
elvisLike<String>("", null).length
// OK
elvisLike<String?>(null, "").length
// Error: 'null' cannot be a value of a non-null type
elvisLike<String?>(null, null).length
}
6、标准库
在Kotlin 1.7.0中,标准库进行了一系列更改和改进。它们引入了新的特性,稳定了实验性的特性,并统一了对Native、JS和JVM的命名捕获组的支持: