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的命名捕获组的支持:

猜你喜欢

转载自blog.csdn.net/old_land/article/details/130218138