Geschichte der Frage: Kotlin wurde ursprünglich als eine Sprache mit einem prägnanten, aber strengen typisierten Syntax entworfen. Um die Lesbarkeit zu verbessern und Code-Duplikation zu reduzieren, wurde eine leistungsstarke Typinferenz (Type Inference) implementiert.
Problem: Manchmal wird die Typdeklaration überflüssig und kompliziert den Code. Aber eine übermäßige Typverkürzung führt zu Schwierigkeiten beim Lesen und zur Verbreitung von Fehlern, wenn der Compiler den Typ nicht ableiten kann.
Lösung: Die Typinferenz ermöglicht es dem Compiler, die meisten Typen automatisch basierend auf der Initialisierung oder dem Kontext zu bestimmen. Aber die strikte Typisierung überwacht weiterhin die Korrektheit des Codes.
Beispielcode:
val name = "Kotlin" // String, Typ wird automatisch abgeleitet var count = 5 // Int, Typ wird automatisch abgeleitet val items = listOf(1, 2, 3) // List<Int> // Eine explizite Typangabe ist erforderlich, wenn die Ableitung nicht möglich ist val callback: (Int) -> Unit = { println(it) }
Wesentliche Merkmale:
Ist es möglich, den Rückgabetyp einer öffentlichen Funktion nicht anzugeben?
Nein, wenn die Funktion öffentlich ist, wird der Compiler eine explizite Deklaration des Rückgabetyps zur Stabilität der Schnittstellen und zur Unterstützung von Java-Interoperabilität verlangen.
Beispiel:
// Fehler! public fun compute(x: Int) = x * 2 // Erforderlich explizit: public fun compute(x: Int): Int = x * 2
Welcher Typ hat val x = null?
Der Compiler kann den Typ nicht ableiten, weil null keinen Typ ohne Kontext hat. Es ist erforderlich, den Typ explizit anzugeben:
val x: String? = null
Kann die Typinferenz für komplexe generische Typen bei der Kettenverarbeitung von Sammlungen funktionieren?
Ja, aber wenn der Typ nicht eindeutig abgeleitet werden kann (z.B. map wandelt Typen um), ist manchmal eine explizite Angabe des Variablentyps erforderlich:
val values = listOf("1", "2").map { it.toInt() } // List<Int>, der Typ wird abgeleitet
Im Projekt werden alle Variablen ohne Typangabe deklariert, was die Navigation und das Verständnis des Codes für andere Entwickler oder neue Mitarbeiter erschwert.
Vorteile:
Nachteile:
Innerhalb von Funktionen werden die Typen der Variablen automatisch abgeleitet, aber in allen öffentlichen APIs wird immer der Rückgabewert und die Typen der Parameter explizit angegeben.
Vorteile:
Nachteile: