Às vezes é necessário expressar que o tipo de um objeto é um subtipo de vários outros tipos. Em Scala isso pode ser expresso com a ajuda de tipos compostos, que são interseções de tipos de objetos.
Suponha que temos duas traits Cloneable and Resetable:
trait Cloneable extends java.lang.Cloneable {
  override def clone(): Cloneable = { 
    super.clone().asInstanceOf[Cloneable]
  }
}
trait Resetable {
  def reset: Unit
}
Agora supondo que queremos escrever uma função cloneAndReset que recebe um objeto, clona e reseta o objeto original:
def cloneAndReset(obj: ?): Cloneable = {
  val cloned = obj.clone()
  obj.reset
  cloned
}
A questão é: qual é o tipo do parâmetro obj? Se for Cloneable então o objeto pode ser clonado, mas não resetado; Se for Resetable nós podemos resetar, mas não há nenhuma operação para clonar. Para evitar conversão de tipos em tal situação, podemos especificar o tipo de obj para ser tanto Cloneable como Resetable. Este tipo composto pode ser escrito da seguinte forma em Scala: Cloneable with Resetable.
Aqui está a função atualizada:
def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {
  //...
}
Os tipos de compostos podem consistir em vários tipos de objeto e eles podem ter um único refinamento que pode ser usado para restrigir a assinatura de membros de objetos existentes.
A forma geral é: A with B with C ... { refinamento }
Um exemplo para o uso de refinamentos é dado na página sobre tipos abstratos.
Contributors to this page:
Contents
- Introdução
 - Basics
 - Tipos Unificados
 - Classes
 - Parâmetro com Valor Padrão
 - Parâmetros Nomeados
 - Traits
 - Tuplas
 - Composição de Classes Mixin
 - Funções de ordem superior
 - Funções Aninhadas
 - Currying
 - Classes Case
 - Correspondência de Padrões
 - Objetos Singleton
 - Padrões de Expressões Regulares
 - Objetos Extratores
 - For Comprehensions
 - Classes Genéricas
 - Variâncias
 - Limitante Superior de Tipos
 - Limitante Inferior de Tipos
 - Classes Internas
 - Tipos Abstratos
 - Tipos Compostos
 - Auto Referências Explicitamente Tipadas
 - Parâmetros Implícitos
 - Conversões Implícitas
 - Métodos Polimórficos
 - Inferência de Tipo Local
 - Operadores
 - By-name Parameters
 - Anotações
 - Packages and Imports
 - Package Objects