Следующий код пытается подражать Полиморфное встраивание 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: Inner Classes, мне кажется, что проблема заключается в том, что useInner ожидает в качестве аргумента экземпляр Inner из конкретного экземпляра Outer.
Какое истинное объяснение и как решить эту проблему?