什么是 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
修饰符。
首先,我必须澄清,我不是在问什么是内联函数或什么是内联 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
修饰符。