什么是 Kotlin 中的内联构造函数?

What's an inline constructor in Kotlin?

首先,我必须澄清,我不是在问什么是内联函数或什么是内联 class。 Kotlin 语言文档或规范中没有对内联构造函数的任何引用,但如果您查看 Arrays.kt source you see this class: ByteArray 有一个内联构造函数:

/**
 * An array of bytes. When targeting the JVM, instances of this class are represented as `byte[]`.
 * @constructor Creates a new array of the specified [size], with all elements initialized to zero.
 */
public class ByteArray(size: Int) {
    /**
     * Creates a new array of the specified [size], where each element is calculated by calling the specified
     * [init] function.
     *
     * The function [init] is called for each array element sequentially starting from the first one.
     * It should return the value for an array element given its index.
     */
    public inline constructor(size: Int, init: (Int) -> Byte)

假设我们想要创建一个类似的 class,如下所示:

    public class Student(name: String) {
        public inline constructor(name: String, age: Int) : this(name)
    }

如果您尝试在 Kotlin 中创建 class 并为其编写内联构造函数,您会发现这是不可能的,并且 IDE 指的是此错误:

Modifier 'inline' is not applicable to 'constructor'

那么让我们回顾一下,ByteArray定义是如何正确的?

您正在查看的 ByteArray 声明不是真实的,它是所谓的内置类型。此声明的存在是为了方便,但从未真正编译为二进制文件。 (事实上​​ ,在 JVM 上,数组是特殊的,并且在任何地方都没有对应的 class 文件。)

此构造函数被标记为内联,因为在实践中,编译器会在每个调用站点发出与其主体对应的代码。所有调用站点检查都是相应完成的(lambda 参数的处理方式使编译器知道它会被倾斜)。

用户 classes 无法进行构造函数内联,因此在用户代码中禁止使用 inline 修饰符。