scala/ScalaBook/chapter-03/type2.scala

class ClassA {
  private var nameA = "Class A"
  def getName = nameA
  def setName(y: String) = nameA=y
}

class ClassB {
  private var nameB = "Class B"
  def getName = nameB
  def setName(y: String) = nameB=y
}

val items = List[{ def getName: String }](new ClassA, new ClassB)

// despite Foo and Bar being completely types, the compiler "knows"
// that they will both implement our anonymous type declaration
items.map(_.getName).foreach(println)

type HasName = { def getName: String }

def printName(o: HasName) = println(o.getName)

val items2 = List[HasName](new ClassA, new ClassB)
items2.foreach(printName)

//Thomas Lee http://www.deskchecked.com/2007/11/12/anonymous-type-acrobatics-with-scala/