Storia della questione: Kotlin è stato progettato inizialmente come un linguaggio con una sintassi concisa ma fortemente tipizzata. Per aumentare la leggibilità e ridurre la duplicazione del codice è stata implementata una potente inferenza dei tipi.
Problema: A volte la dichiarazione del tipo diventa superflua, complicando il codice. Ma la riduzione eccessiva dei tipi porta a difficoltà di lettura e alla diffusione di errori, se il compilatore non riesce a dedurre il tipo.
Soluzione: L'inferenza dei tipi consente al compilatore di determinare automaticamente la maggior parte dei tipi sulla base dell'inizializzazione o del contesto. Ma la tipizzazione rigorosa continua a controllare la correttezza del codice.
Esempio di codice:
val name = "Kotlin" // String, tipo dedotto automaticamente var count = 5 // Int, tipo dedotto automaticamente val items = listOf(1, 2, 3) // List<Int> // Specifica esplicita del tipo richiesta se l'inferenza non è possibile val callback: (Int) -> Unit = { println(it) }
Caratteristiche chiave:
È possibile non specificare il tipo di ritorno per una funzione pubblica?
No, se la funzione è pubblica, il compilatore richiederà una dichiarazione esplicita del tipo di ritorno per la stabilità delle interfacce e il supporto dell'interoperabilità con Java.
Esempio:
// Errore! public fun compute(x: Int) = x * 2 // Richiesta esplicita: public fun compute(x: Int): Int = x * 2
Qual è il tipo di val x = null?
Il compilatore non riuscirà a dedurre il tipo, poiché null non ha tipo senza contesto. È necessario dichiarare esplicitamente il tipo:
val x: String? = null
L'inferenza dei tipi può funzionare per tipi generici complessi durante l'elaborazione a catena delle collezioni?
Sì, ma se il tipo non può essere dedotto in modo univoco (ad esempio, map trasforma i tipi), a volte sarà necessario specificare esplicitamente il tipo della variabile:
val values = listOf("1", "2").map { it.toInt() } // List<Int>, tipo sarà dedotto
Nel progetto tutte le variabili sono dichiarate senza specificare il tipo, rendendo difficile la navigazione e la comprensione del codice per altri sviluppatori o nuovi assunti.
Vantaggi:
Svantaggi:
All'interno delle funzioni i tipi delle variabili vengono dedotti automaticamente, ma in tutte le API pubbliche viene sempre specificato esplicitamente il tipo di ritorno e i tipi dei parametri.
Vantaggi:
Svantaggi: