Следующий код пытается подражать Полиморфному Встраиванию DSLs: вместо того, чтобы подавать поведение 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
экземпляр.
Каково истинное объяснение и как решить эту проблему?
Я полагаю, что внутренний тип похож на тип this.inner. Внутренний внутренний # не зависит от внешнего экземпляра (не зависимый тип пути).
abstract class Outer {
sealed class Inner {
def enclosing = Outer.this
}
def useInner(x:Outer#Inner) : Boolean
}
def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x)
Проблема в том, что вы описываете, что Useinner
ожидает внутреннего
определенного внешнего
экземпляра. С включение
возвращает универсальный Внешний
, на самом деле нет способа связать оба вместе, что я знаю.
Вы можете заставить его, однако:
def toBoolean(x: Outer#Inner): Boolean = {
val outer = x.enclosing
outer.useInner(x.asInstanceOf[outer.Inner])
}
Вы также можете определить своего члена так:
def useInner(x:Outer#Inner) : Boolean
Или вы можете написать так:
abstract class Outer {
class InnerImpl {
def enclosing = Outer.this
}
final type Inner = Outer#InnerImpl
def useInner(x:Inner) : Boolean
}