aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/pets.scala
blob: e1d5df44e3ff6343d40d13df1c9987167ca32242 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Representing the current type
trait Pet {
  type This <: Pet
  def name: String
  def renamed(newName: String): This
}

case class Fish(name: String, age: Int) extends Pet {
  type This = Fish
  def renamed(newName: String): Fish = copy(name = newName)
}

case class Kitty(name: String, age: Int) extends Pet {
  type This = Kitty
  def renamed(newName: String): Kitty = copy(name = newName)
}

object Test {
  def esquire[A <: Pet](a: A): a.This = a.renamed(a.name + ", Esq.")
  val f: Fish = esquire(new Fish("bob", 22))
}