Kotlin Language Specification (spec) di kotlinlang.org/spec/ adalah dokumen formal yang menjelaskan perilaku bahasa Kotlin secara presisi. Berbeda dari dokumentasi tutorial yang berorientasi contoh, spec menulis aturan dalam bentuk definisi formal — kadang disertai BNF grammar — sehingga tidak ada ruang tafsir. Pada chapter ini kita memetakan bagian utama spec dan mendemokan beberapa perilaku yang diaturnya: smart cast, operator overloading, overload resolution, default argument, dan nullability.

Bagian Utama Spec #

Spec disusun dalam delapan bagian besar. Setiap bagian menjawab kategori pertanyaan berbeda. Berikut peta singkatnya:

BagianMembahasPertanyaan yang dijawab
1. IntroductionTujuan dan struktur specUntuk siapa spec ditulis
2. Lexical grammarToken, identifier, literalApa yang dianggap token valid
3. Type systemTipe data, nullability, genericBagaimana tipe dirakit
4. ExpressionsOperator, lambda, when, tryBagaimana ekspresi dievaluasi
5. DeclarationsClass, function, property, importApa yang boleh dideklarasikan
6. StatementsAssignment, control flowBagaimana statement bekerja
7. ResolutionOverload, smart cast, type inferenceBagaimana kompilator memilih
8. PatternsDestructuring, builderPola komposisi yang didukung

Smart Cast dan Overload Resolution #

Bagian paling sering dirujuk dari spec adalah bagian 7 (Resolution). Smart cast diatur di sub-bagian 11.1.1, dan overload resolution di bagian 11. Ketika kita menulis if (x is String) x.uppercase(), spec menjelaskan persis kondisi di mana x dianggap String di dalam branch then. Ketika kita memanggil panggil(42) dengan beberapa overload, spec menjelaskan aturan prioritas: tipe yang lebih spesifik menang.

Cuplikan berikut mendemokan smart cast, operator overloading, overload resolution, default argument, dan nullability sekaligus:

kotlin
// kotlin_language_specification.kt
// Demonstrasi beberapa perilaku yang diatur oleh Kotlin Language Specification
// (https://kotlinlang.org/spec/).
// Spec menjelaskan aturan resolusi overloading, smart cast, dan inferensi tipe
// secara formal.

// 1. Smart cast — spec menjelaskan kapan smart cast berlaku
fun smartCastDemo(x: Any): String {
    if (x is String) {
        // Smart cast otomatis ke String; spec bagian 11.1.1
        return x.uppercase()
    }
    return "bukan string"
}

// 2. Operator overloading — spec bagian 13 (Operator functions)
data class Vektor(val x: Int, val y: Int) {
    operator fun plus(other: Vektor) = Vektor(x + other.x, y + other.y)
    operator fun times(skalor: Int) = Vektor(x * skalor, y * skalor)
}

// 3. Resolution ambiguity — spec bagian 11 (Overload resolution)
class Layanan {
    fun panggil(x: Int) = "int"
    fun panggil(x: String) = "string"
    fun panggil(x: Any) = "any"
}

// 4. Default argument — spec bagian 8.5.1 (Default values)
fun buatNama(depan: String = "Tanpa", belakang: String = "Nama") =
    "$depan $belakang"

// 5. Elaborasi tipe nullable — spec bagian 7.1 (Nullability)
fun panjangNullable(s: String?): Int = s?.length ?: 0

fun main() {
    println("=== Kotlin Language Specification ===")
    println("Sumber resmi: https://kotlinlang.org/spec/")
    println()

    println("--- 1. Smart cast (spec 11.1.1) ---")
    println("smartCastDemo(\"halo\")  -> ${smartCastDemo("halo")}")
    println("smartCastDemo(42)      -> ${smartCastDemo(42)}")

    println()
    println("--- 2. Operator overloading (spec 13) ---")
    val a = Vektor(1, 2)
    val b = Vektor(3, 4)
    println("a + b = ${a + b}")
    println("a * 5 = ${a * 5}")

    println()
    println("--- 3. Overload resolution (spec 11) ---")
    val l = Layanan()
    println("panggil(42)       -> ${l.panggil(42)}")        // int (paling spesifik)
    println("panggil(\"halo\")   -> ${l.panggil("halo")}")  // string (paling spesifik)
    println("panggil(true)     -> ${l.panggil(true)}")      // any (fallback)

    println()
    println("--- 4. Default argument (spec 8.5.1) ---")
    println("buatNama()                 -> ${buatNama()}")
    println("buatNama(\"Budi\")            -> ${buatNama("Budi")}")
    println("buatNama(\"Siti\", \"Dewi\")    -> ${buatNama("Siti", "Dewi")}")
    println("buatNama(belakang=\"X\")      -> ${buatNama(belakang = "X")}")

    println()
    println("--- 5. Nullability (spec 7.1) ---")
    println("panjangNullable(\"halo\") -> ${panjangNullable("halo")}")
    println("panjangNullable(null)   -> ${panjangNullable(null)}")

    println()
    println("--- 6. Bagian utama spec ---")
    val bagian = listOf(
        "1. Introduction — tujuan dan struktur spec",
        "2. Lexical grammar — token, identifier, literal",
        "3. Type system — tipe data, nullability, generic",
        "4. Expressions — operator, lambda, when, try",
        "5. Declarations — class, function, property, import",
        "6. Statements — assignment, control flow",
        "7. Resolution — overload, smart cast, type inference",
        "8. Patterns — destructuring, builder"
    )
    bagian.forEach { println("  $it") }

    println()
    println("--- 7. Cara membaca spec ---")
    println("  Spec ditulis dalam Markdown berisi aturan formal (kadang BNF)")
    println("  Tidak semua section relevan untuk sehari-hari; fokus ke bagian")
    println("  yang menjelaskan perilaku membingungkan (smart cast, overload)")
}

Output yang Dihasilkan:

text
=== Kotlin Language Specification ===
Sumber resmi: https://kotlinlang.org/spec/

--- 1. Smart cast (spec 11.1.1) ---
smartCastDemo("halo")  -> HALO
smartCastDemo(42)      -> bukan string

--- 2. Operator overloading (spec 13) ---
a + b = Vektor(x=4, y=6)
a * 5 = Vektor(x=5, y=10)

--- 3. Overload resolution (spec 11) ---
panggil(42)       -> int
panggil("halo")   -> string
panggil(true)     -> any

--- 4. Default argument (spec 8.5.1) ---
buatNama()                 -> Tanpa Nama
buatNama("Budi")            -> Budi Nama
buatNama("Siti", "Dewi")    -> Siti Dewi
buatNama(belakang="X")      -> Tanpa X

--- 5. Nullability (spec 7.1) ---
panjangNullable("halo") -> 4
panjangNullable(null)   -> 0

--- 6. Bagian utama spec ---
  1. Introduction — tujuan dan struktur spec
  2. Lexical grammar — token, identifier, literal
  3. Type system — tipe data, nullability, generic
  4. Expressions — operator, lambda, when, try
  5. Declarations — class, function, property, import
  6. Statements — assignment, control flow
  7. Resolution — overload, smart cast, type inference
  8. Patterns — destructuring, builder

--- 7. Cara membaca spec ---
  Spec ditulis dalam Markdown berisi aturan formal (kadang BNF)
  Tidak semua section relevan untuk sehari-hari; fokus ke bagian
  yang menjelaskan perilaku membingungkan (smart cast, overload)

Perhatikan tiga kelompok utama yang dicetak: smart cast mengubah Any menjadi String setelah is-check, operator overloading menghasilkan Vektor baru, dan overload resolution memilih overload paling spesifik (panggil(42) mengembalikan "int", bukan "any"). Empat kelompok sisanya mencetak ringkasan struktur spec dan tips membaca.

Cara Membaca Spec #

Spec ditulis dalam Markdown dengan banyak definisi formal. Tidak semua bagian relevan untuk pekerjaan sehari-hari; fokuskan ke bagian yang menjelaskan perilaku yang membingungkan: smart cast (11.1.1), overload resolution (11), dan nullability (7.1). Bila kita bertemu perilaku tak terduga di kompilator, cari di spec dulu sebelum mengarang teori sendiri.

Referensi Lanjutan #

Selanjutnya #

Setelah memahami aturan formal bahasa, langkah berikutnya adalah memahami standard library Kotlin. Chapter berikutnya membahas Kotlin API reference — peta function, package, dan cara navigasinya.