Хотя это не прямой ответ на оригинальный вопрос, он может быть полезен для будущих читателей.Из Википедии :
Scala позволяет смешивать черты (создание анонимного типа) при создании нового экземпляра класса.
Thisозначает, что with
можно использовать за пределами верхней строки определения класса.Пример:
trait Swim {
def swim = println("Swimming!")
}
class Person
val p1 = new Person // A Person who can't swim
val p2 = new Person with Swim // A Person who can swim
p2
здесь доступен метод swim
, а p1
- нет. real тип p2
является "анонимным", а именно Person with Swim
.Фактически, синтаксис with
может использоваться в любой сигнатуре типа:
def swimThemAll(ps: Seq[Person with Swim]): Unit = {
ps.foreach(_.swim)
}
EDIT (2016 Oct 12): Мы обнаружили причуду.Следующее не будет компилироваться:
// each `x` has no swim method
def swim(xs: Seq[_ >: Person with Swim]): Unit = {
xs.foreach(_.swim)
}
Это означает, что с точки зрения лексического приоритета with
связывается с нетерпением.Это _ >: (Person with Swim)
, а не (_ >: Person) with Swim
.