En primer lugar, tengo que aclarar que no estoy preguntando qué es una función en línea o qué es una clase en línea. No hay ninguna parte en la documentación o especificación del lenguaje Kotlin que haga referencia a un constructor en línea, pero si observa la fuente Arrays.kt , verá esta clase: ByteArray tiene un constructor en línea:
/** * 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)Consideremos que queremos crear una clase similar, algo como esto:
public class Student(name: String) { public inline constructor(name: String, age: Int) : this(name) }Si intenta crear esa clase en Kotlin y escribe un constructor en línea para ella, verá que es imposible y IDE se refiere a este error:
El modificador 'en línea' no es aplicable a 'constructor'
Entonces, recapitulemos, ¿cómo es correcta la definición de ByteArray ?
La declaración de ByteArray que está viendo no es real, es un tipo llamado integrado. Esta declaración existe por conveniencia, pero nunca se compila verdaderamente en un binario. (De hecho, en la JVM, las matrices son especiales y no tienen archivos de clase correspondientes en ninguna parte).
Este constructor está marcado en línea porque en la práctica el compilador emite el código correspondiente a lo que sería su cuerpo en cada sitio de llamada. Toda la verificación del sitio de llamadas se realiza en consecuencia (el argumento lambda se trata de tal manera que el compilador sabe que se inclinará).
La inserción de constructores no es posible para las clases de usuario, por lo que el modificador inline está prohibido en el código de usuario.