Что касается типа внутреннего класса в Scala

Следующий код пытается подражать Полиморфному Встраиванию 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 экземпляр.

Каково истинное объяснение и как решить эту проблему?

13
задан Alban Linard 2 February 2010 в 12:30
поделиться

3 ответа

Я полагаю, что внутренний тип похож на тип 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)
16
ответ дан 1 December 2019 в 22:57
поделиться

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

Вы можете заставить его, однако:

def toBoolean(x: Outer#Inner): Boolean = {
  val outer = x.enclosing
  outer.useInner(x.asInstanceOf[outer.Inner])
}
4
ответ дан 1 December 2019 в 22:57
поделиться

Вы также можете определить своего члена так:

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
}
0
ответ дан 1 December 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: