First of all, I have to clarify I'm not asking what's an inline function is or what's an inline class is.
There's nowhere in Kotlin Language documentation or specification any reference to an inline constructor but if you look in Arrays.kt
source you see this class: ByteArray
has an inline constructor:
/**
* 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)
Let's consider we want to create a similar class, something like this:
public class Student(name: String) {
public inline constructor(name: String, age: Int) : this(name)
}
If you try to create that class in Kotlin and write an inline constructor for it you see that it's impossible and IDE refers to this error:
Modifier 'inline' is not applicable to 'constructor'
So let's recap, how ByteArray
definition is correct?
Modifier 'inline' is not applicable to 'constructor'
which is defined by the language spec (kotlinlang.org/spec). I don't know for sure, but at a guess, because these are built-in types they're "breaking the rules" and making an exception in this specific case, and allowing theinit
function to be inlined by the compiler, to make initialising arrays more efficient – Tizesinline
is allowed. I mean like you said yourself, if you try to useinline constructor
it won't compile, but it works for this internal stuff (and that constructor signature is explicitly spelled out in the spec: kotlinlang.org/spec/…). Could be a specially written case, or maybe inlining constructors is possible but disallowed in general – Tizesinline
to let you know that any lambda you pass won't generate a function object. – Danndanna