Мой мета-вопрос был бы "Как мне задать этот вопрос вразумительно?"но, возможно, пример прояснит ситуацию:
trait Toolbox {
trait Bolt
trait Wrench {
def tighten(b : Bolt)
}
def getWrench : Wrench
def getBolt : Bolt
}
object MetricToolbox extends Toolbox {
...
}
object EnglishToolbox extends Toolbox {
...
}
Конечно, метрический гаечный ключ может затягивать только метрический болт;То же самое для инструментов из английской панели инструментов.Мой вопрос заключается в том, как мне выразить это безопасным для типов способом, чтобы следующее не компилировалось:
MetricToolbox.getWrench tighten EnglishToolbox.getBolt
, но следующее будет:
def doTighten(box : Toolbox) = box.getWrench tighten box.getBolt
Я точно знаю, что это возможно, потому что я слышал, как Мартин Одерский произнес это своими устами на встрече Скала вчера вечером, но в этот момент моя жена позвонила в мою камеру, и мне пришлось выскочить из комнаты, прежде чем он объяснилhow.
EDIT didierd указал, что мой код работает как написано.Он прав - я немного неясен в деталях, но это так.Естественный обратный вопрос: как я не могу это сделать?Ответ был довольно прост: поместите эти классы на один уровень с основной чертой.
trait Nail
trait Hammer {
def pound(n : Nail)
}
trait Toolbox {
trait Bolt
trait Wrench {
def tighten(b : Bolt)
}
def getWrench : Wrench
def getBolt : Bolt
def getNail : Nail
def getHammer : Hammer
}
MetricToolbox.getHammer pound EnglishToolbox.getNail // this DOES compile