Inferenza dei tipi
Lasci che sia il compilatore a dedurre i tipi.
Inferenza dei tipi è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Che cos'è l'inferenza dei tipi?
Scala è tipizzata staticamente, ma raramente dovete scrivere esplicitamente i tipi. Il compilatore li inferisce dal valore a destra dell'assegnazione.
In questo modo ottenete la sicurezza dei tipi con la concisione di un linguaggio dinamico.
val n = 42 // inferred Int
val label = "hi" // inferred StringInferire dai letterali
Quando scrivete val x = 5, il compilatore riconosce il letterale Int e assegna a x il tipo Int.
Un letterale decimale diventa un Double, mentre il testo tra virgolette diventa una String.
object Main extends App {
val count = 5
val ratio = 1.5
println(count + ratio)
}Inferenza dei valori restituiti dalle funzioni
Il compilatore può anche inferire il tipo restituito da un metodo a partire dal suo corpo.
Qui square restituisce un Int perché il corpo moltiplica due valori Int. Non è stato necessario dichiararlo.
object Main extends App {
def square(x: Int) = x * x
println(square(6))
}I parametri richiedono comunque i tipi
L'inferenza ha dei limiti. I parametri dei metodi devono essere annotati, perché il compilatore non ha alcun elemento da cui inferirli.
Il frammento seguente non verrebbe compilato senza : Int su x.
def increment(x: Int) = x + 1 // type on x is requiredTipo comune inferito
Quando i valori potrebbero avere più tipi, Scala inferisce il tipo comune più specifico.
Combinare un Int e un Double in un'operazione aritmetica amplia il risultato a Double.
object Main extends App {
val mixed = 3 + 2.0 // Double
println(mixed)
}Inferenza nelle collection
Le collection inferiscono il tipo degli elementi dai valori che inserite.
Un elenco di interi diventa automaticamente List[Int], permettendovi di mantenere la piena sicurezza dei tipi senza annotazioni.
object Main extends App {
val nums = List(1, 2, 3) // List[Int]
println(nums.sum)
}Quando l'inferenza vi sorprende
A volte l'inferenza sceglie un tipo più ampio di quello desiderato. Un elenco di numeri misti può essere inferito come List[Double] o persino List[AnyVal].
Se il tipo inferito non è adatto alle vostre esigenze, aggiungete un'annotazione esplicita.
val a = List(1, 2.0) // List[Double]
val b = List(1, "two") // List[Any]Sovrascrivere con le annotazioni
Potete sempre essere espliciti. Annotare un tipo documenta l'intento e sovrascrive un'inferenza troppo ristretta.
Qui il letterale 7 viene ampliato deliberatamente a un Long.
val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)API pubbliche: siate espliciti
Una regola di stile comune: lasciate che l'inferenza gestisca le val locali, ma dichiarate esplicitamente i tipi restituiti dai metodi pubblici.
Questo mantiene stabile il contratto della vostra libreria anche se l'implementazione cambia.
def total(items: List[Int]): Int = items.sumL'inferenza mantiene la sicurezza dei tipi
L'inferenza non indebolisce il sistema dei tipi. Il compilatore continua a rifiutare le operazioni non valide.
Qui name viene inferito come String, quindi moltiplicarlo per un numero genera un errore di compilazione, come è giusto che sia.
val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this senseUna val inferita è comunque immutabile
L'inferenza completa soltanto il tipo. Non modifica la mutabilità dell'associazione.
Una val n = 10 è comunque immutabile e ha tipo Int; il compilatore vi ha semplicemente risparmiato la scrittura di : Int.
object Main extends App {
val n = 10 // inferred Int, still a val
println(n * n)
}Verifica rapida
In quale caso Scala richiede ancora di scrivere esplicitamente un tipo?
Riepilogo
L'inferenza dei tipi permette a Scala di essere concisa senza perdere la sicurezza garantita dalla tipizzazione statica.
- Il tipo dei
vallocali e i tipi restituiti vengono generalmente inferiti. - I parametri dei metodi devono essere annotati.
- L'inferenza sceglie il tipo comune più specifico.
- Specificate esplicitamente il tipo per le API pubbliche o per correggere un'inferenza inattesa.
Domande Frequenti
La lezione «Inferenza dei tipi» è gratuita?
Sì — il testo completo di «Inferenza dei tipi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Cosa imparerò in «Inferenza dei tipi»?
Lasci che sia il compilatore a dedurre i tipi. Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?
Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Inferenza dei tipi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?
Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- val e var a confronto
- Tipi e valori letterali di base
- Inferenza dei tipi
- Espressioni al posto delle istruzioni