Следующий код пытается имитировать Полиморфное встраивание DSL : вместо того, чтобы задавать поведение в Inner
, он кодируется в методе useInner
своего включающего класса. Я добавил метод enclosing
, чтобы пользователь мог хранить только ссылку на экземпляры Inner
, но всегда мог получить включающий его экземпляр. Таким образом, все Inner
экземпляры из конкретного Outer
экземпляра привязаны только к одному поведению (но здесь это необходимо).
abstract class Outer {
sealed class Inner {
def enclosing = Outer.this
}
def useInner(x:Inner) : Boolean
}
def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x)
Не компилируется и scala 2.8 жалуется на:
type mismatch; found: sandbox.Outer#Inner
required: _81.Inner where val _81:sandbox.Outer
Из Программирование Scala: вложенные классы и Тур по Scala: Внутренние классы , мне кажется, что проблема в том, что useInner
ожидает в качестве аргумента экземпляр Inner
из определенного экземпляра Outer
.
Каково истинное объяснение и как решить эту проблему?