14

次のコードは、DSL のポリモーフィック埋め込みを模倣しようとしてInnerいますuseInnerenclosingユーザーがインスタンスへの参照を保持するだけでよいように、メソッドを追加しましたInnerが、常にそれを囲むインスタンスを取得できます。これによりInner、特定のインスタンスのすべてのインスタンスOuterが 1 つの動作のみにバインドされます (ただし、ここでは必要です)。

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

Programming Scala: Nested classesA Tour of Scala: Inner Classesから、問題は特定useInnerのインスタンスからのインスタンスを引数として期待することだと私には思えます。InnerOuter

この問題の本当の説明と解決方法は何ですか?

4

3 に答える 3

17

タイプ Inner はタイプ this.Inner のようなものだと思います。Outer#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)
于 2010-02-02T12:55:27.137 に答える
4

問題は、あなたが説明したように、特定のインスタンスuseInnerを期待していることです。generic を返すため、私が知っている両方を結び付ける方法は実際にはありません。InnerOuterenclosingOuter

ただし、強制することはできます。

def toBoolean(x: Outer#Inner): Boolean = {
  val outer = x.enclosing
  outer.useInner(x.asInstanceOf[outer.Inner])
}
于 2010-02-02T18:21:00.593 に答える
1

次のようにメンバーを定義することもできます。

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
}
于 2010-04-10T13:34:35.153 に答える