0Pricing
Scala for Backend Engineering & Functional Programming · Lezione

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 String

Inferire 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 required

Tipo 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.sum

L'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 sense

Una 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 val locali 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

  1. val e var a confronto
  2. Tipi e valori letterali di base
  3. Inferenza dei tipi
  4. Espressioni al posto delle istruzioni
← Torna a Scala for Backend Engineering & Functional Programming