下面的代碼嘗試模仿Polymorphic Embedding of DSLs:而不是在Inner
中給出行爲,它將在其封閉類的useInner
方法中進行編碼。我添加了enclosing
方法,以便用戶只需保留對Inner
實例的引用,但始終可以獲取其封閉實例。通過這樣做,來自特定Outer
實例的所有Inner
實例都只能綁定一個行爲(但在此需要)。引用Scala中的內部類的類型
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 classes和A Tour of Scala: Inner Classes,在我看來,這個問題是useInner
預計作爲參數從特定Outer
例如一個Inner
實例。
什麼是真正的解釋和如何解決這個問題?
是否有可能修改toBoolean而不是useInner? – 2010-02-02 13:11:21
如果嘗試'def toBoolean(x:y.Inner forSome {val y:Outer}):Boolean = x.enclosing.useInner(x)'(存在類型 - 來自Scala參考的存在量化值)但它沒有工作。 – 2010-02-02 13:36:16