Как использовать типы одиночных объектов Scala?

Я пишу класс, который служит базовым классом для серии одноэлементных объектов. В каждом одноэлементном объекте будут vals, представляющие определенные свойства, и я хочу написать метод, который для каждого одноэлементного объекта принимает только созданные им объекты.

Итак, у меня есть следующее:

class Obj[M <: Maker]

class Maker {
  implicit val me: this.type = this
  def make[M <: Maker](implicit maker: M) = new Obj[M]
  def accept(obj: Obj[this.type]) = {...}
}

Пока все хорошо. Затем я хочу объявить один из этих одноэлементных объектов:

object M extends Maker {
  val a = make
}

Но затем, если я попробую это:

M.accept(M.a)

, я получу ошибку времени компиляции:

type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]

Мои вопросы:

  1. Какой тип объекта com.test.M , и чем он отличается от com.test.M.type ?
  2. Как я могу сделать это более умным способом?
6
задан Jean-Philippe Pellet 30 November 2010 в 15:56
поделиться