Il seguente codice prova a imitare Polymorphic Embedding of DSLs: anziché dare il comportamento in Inner
, è codificato nel metodo useInner
della sua classe di inclusione. Ho aggiunto il metodo enclosing
in modo che l'utente debba solo mantenere un riferimento alle istanze Inner
, ma può sempre ottenere l'istanza che le include. In questo modo, tutte le istanze Inner
da un'istanza specifica Outer
sono associate a un solo comportamento (ma è necessario qui).Riferendosi al tipo di una classe interna in 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)
E non compila e Scala 2.8 si lamenta:
type mismatch; found: sandbox.Outer#Inner
required: _81.Inner where val _81:sandbox.Outer
Da Programming Scala: Nested classes e A Tour of Scala: Inner Classes, mi sembra che il problema è che useInner
aspetta come argomento una Inner
istanza da una specifica Outer
un'istanza .
Qual è la vera spiegazione e come risolvere questo problema?
E 'possibile modificare in Booleano invece di useInner? –
Se provato 'def aBoolean (x: y.Inner forSome {val y: Outer}): Boolean = x.enclosing.useInner (x)' (Tipi esistenziali - Quantificazione esistenziale su valori dal riferimento Scala) ma non lavoro. –