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

15

首先,我必须澄清我不是在问什么是内联函数或什么是内联类。 在Kotlin语言文档或规范中没有任何关于内联构造函数的参考,但是如果您查看Arrays.kt源代码,您会看到这个类: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)

假设我们想创建一个类似的类,就像这样:

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

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

修饰符“inline”不适用于“constructor”

所以让我们回顾一下,ByteArray 的定义是正确的吗?


1
很确定这是不可用的内容,只出现在内置类的伪源代码中。 - Tenfour04
@cactustictacs违反规则了吗?毕竟这是Kotlin代码,所以他们必须使用不同的编译器来编译标准库,对吧? - YaMiN
@Tenfour04 我认为这不是伪源代码,而是官方源代码。 - YaMiN
我的意思是编译器可以特别编写以不同方式处理这些内置数组类型,因此当将此Kotlin代码转换为字节码时,它将被视为一种特殊情况,并且inline是允许的。我是说就像你自己所说的,如果尝试使用inline constructor,它将无法编译,但对于这个内部内容却有效(并且该构造函数签名在规范中明确说明:https://kotlinlang.org/spec/built-in-types-and-their-semantics.html#built-in-array-types)。可能是一个特别编写的情况,或者也可能是内联构造函数在一般情况下是可能的,但被禁止了。 - cactustictacs
4
这是伪代码。标准库不是从你正在查看的代码编译而来的。这个函数甚至没有主体。它只是为了文档目的而存在。顶部有一个注释说它是自动生成的。我认为它被标记为“inline”,是为了让你知道,任何传递的lambda都不会生成函数对象。 - Tenfour04
显示剩余2条评论
1个回答

18

你所看到的ByteArray声明并不是真实存在的,它是一种所谓的内置类型。这个声明只是为了方便存在,但它并没有真正编译成二进制代码。(事实上,在JVM上,数组是特殊的,不存在相应的类文件。)

这个构造函数被标记为inline,因为实际上编译器会在每个调用点处发出与其主体相对应的代码。所有的调用点检查都相应地进行(lambda参数的处理方式使编译器知道它会被倾向于使用)。

构造函数内联对于用户类来说是不可能的,所以inline修饰符在用户代码中是被禁止的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接