0Pricing
Scala for Backend Engineering & Functional Programming · Aula

Inferência de tipos

Deixe o compilador descobrir os tipos.

Inferência de tipos é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Scala for Backend Engineering & Functional Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que é inferência de tipos?

Scala tem tipagem estática, mas você raramente precisa escrever os tipos. O compilador os infere a partir do valor do lado direito.

Isso oferece a segurança dos tipos com a concisão de uma linguagem dinâmica.

val n = 42        // inferred Int
val label = "hi" // inferred String

Inferência a partir de literais

Quando você escreve val x = 5, o compilador identifica o literal Int e atribui a x o tipo Int.

Um literal decimal se torna um Double, e um texto entre aspas se torna uma String.

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

Inferência para retornos de funções

O compilador também pode inferir o tipo de retorno de um método a partir do corpo dele.

Aqui, square retorna um Int porque o corpo multiplica dois valores Int. Você não precisou declará-lo.

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

Os parâmetros ainda precisam de tipos

A inferência tem limites. Os parâmetros dos métodos precisam ser anotados, porque o compilador não tem informações a partir das quais possa inferi-los.

O trecho abaixo não seria compilado sem o : Int em x.

def increment(x: Int) = x + 1 // type on x is required

Tipo comum inferido

Quando os valores podem ter vários tipos, o Scala infere o tipo comum mais específico.

Misturar um Int e um Double em uma operação aritmética amplia o resultado para Double.

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

Inferência em coleções

As coleções inferem o tipo de seus elementos a partir dos valores que você insere nelas.

Uma lista de inteiros se torna automaticamente uma List[Int], para que você mantenha toda a segurança de tipos sem anotações.

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

Quando a inferência surpreende você

Às vezes, a inferência escolhe um tipo mais amplo do que você deseja. Uma lista de números mistos pode inferir List[Double] ou até List[AnyVal].

Se o tipo inferido não for adequado às suas necessidades, adicione uma anotação explícita.

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

Substitua com anotações

Você sempre pode ser explícito. Anotar um tipo documenta sua intenção e substitui uma inferência estreita demais.

Aqui, o literal 7 é ampliado deliberadamente para um Long.

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

APIs públicas: seja explícito

Uma regra de estilo comum: deixe a inferência cuidar dos vals locais, mas escreva tipos de retorno explícitos em métodos públicos.

Isso mantém estável o contrato da sua biblioteca, mesmo que a implementação mude.

def total(items: List[Int]): Int = items.sum

A inferência mantém a segurança de tipos

A inferência não enfraquece o sistema de tipos. O compilador ainda rejeita operações inválidas.

Abaixo, name é inferido como String, portanto multiplicá-lo por um número falha na compilação, exatamente como deveria.

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

Um val inferido continua imutável

A inferência apenas preenche o tipo. Ela não altera se uma associação é mutável.

Um val n = 10 continua imutável e fixado como um Int; o compilador apenas poupou você de escrever : Int.

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

Verificação rápida

Em que situação o Scala ainda exige que você escreva um tipo?

Recapitulação

A inferência de tipos permite que o Scala permaneça conciso sem perder a segurança estática.

  • vals locais e tipos de retorno geralmente são inferidos.
  • Os parâmetros dos métodos precisam ser anotados.
  • A inferência escolhe o tipo comum mais específico.
  • Faça anotações explícitas em APIs públicas ou para substituir uma inferência surpreendente.

Perguntas Frequentes

A aula “Inferência de tipos” é grátis?

Sim — o texto completo de “Inferência de tipos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Scala for Backend Engineering & Functional Programming, atualize para CoddyKit PRO. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que vou aprender em “Inferência de tipos”?

Deixe o compilador descobrir os tipos. Você pratica Scala for Backend Engineering & Functional Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Scala for Backend Engineering & Functional Programming?

Nenhuma experiência prévia é necessária. Scala for Backend Engineering & Functional Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Inferência de tipos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Scala for Backend Engineering & Functional Programming?

Sim. Cada aula de Scala for Backend Engineering & Functional Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. val versus var
  2. Tipos básicos e literais
  3. Inferência de tipos
  4. Expressões em vez de instruções
← Voltar para Scala for Backend Engineering & Functional Programming