Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Kotlin中有内联构造函数吗?_Kotlin_Oop_Constructor_Inline - Fatal编程技术网

什么';Kotlin中有内联构造函数吗?

什么';Kotlin中有内联构造函数吗?,kotlin,oop,constructor,inline,Kotlin,Oop,Constructor,Inline,首先,我必须澄清,我不是在问什么是内联函数,什么是内联类。 Kotlin语言文档或规范中没有任何对内联构造函数的引用,但如果查看源代码,您会看到此类:具有内联构造函数: /** *字节数组。以JVM为目标时,此类的实例表示为“byte[]”。 *@constructor创建指定[size]的新数组,所有元素初始化为零。 */ 公共类字节数组(大小:Int){ /** *创建指定[size]的新数组,其中每个元素通过调用指定的 *[init]函数。 * *从第一个数组元素开始,依次为每个数组元素调

首先,我必须澄清,我不是在问什么是内联函数,什么是内联类。 Kotlin语言文档或规范中没有任何对内联构造函数的引用,但如果查看源代码,您会看到此类:具有内联构造函数:

/**
*字节数组。以JVM为目标时,此类的实例表示为“byte[]”。
*@constructor创建指定[size]的新数组,所有元素初始化为零。
*/
公共类字节数组(大小:Int){
/**
*创建指定[size]的新数组,其中每个元素通过调用指定的
*[init]函数。
*
*从第一个数组元素开始,依次为每个数组元素调用函数[init]。
*它应该返回给定索引的数组元素的值。
*/
公共内联构造函数(大小:Int,init:(Int)->字节)

让我们考虑创建一个类似的类,例如:

公共班级学生(姓名:String){
公共内联构造函数(名称:String,年龄:Int):此(名称)
}
如果您试图在Kotlin中创建该类并为其编写内联构造函数,您会发现这是不可能的,IDE引用了此错误:

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


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

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

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


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

嗯,Andrey Breslav的回答很好,但我不太相信Jetbrains团队的回答:

ByteArray
是Kotlin的内置类型,它有自己的成员 实现为编译器内部函数 只是在源代码中没有主体,这样的委托 经常发生

这些构造函数是内联的,以避免实例化
init
lambda对象并避免装箱返回的原语结果 从那个兰姆达

作为例外,我们只允许在内置数组中使用内联构造函数, 但我们通常会遇到跟踪内联构造函数特性的问题


我不确定,但我认为这是因为lambda(内联主要用于使用lambda的东西,以避免使用函数对象),如果您也有lambda,它将不起作用,错误是
修饰符“inline”不适用于语言规范()定义的“constructor”
.我不确定,但我猜,因为这些是内置类型,它们“违反了规则”在这种特殊情况下做一个例外,并允许编译器内联
init
函数,使初始化数组更有效。请确保这是不可用的,并且只出现在内置类的psuedo源代码中。@cactustictacs违反规则?毕竟它是Kotlin cod所以他们必须使用不同的编译器来编译标准库?这是伪代码。标准库不是从你正在查看的代码编译而来的。这个函数甚至没有一个主体。它只是为了文档的目的。顶部有一个注释,它是自动生成的。我想它被标记为
inline
让您知道传递的任何lambda都不会生成函数对象。