Poniższy kod próbuje naśladować Polymorphic Embedding of DSLs: zamiast podawać zachowanie w Inner
, jest kodowany w metodzie otaczającej klasy useInner
. Dodałem metodę enclosing
, aby użytkownik mógł zachować tylko odniesienia do instancji Inner
, ale zawsze może uzyskać ich załączającą instancję. W ten sposób wszystkie instancje z określonej instancji Outer
są powiązane tylko z jednym zachowaniem (ale jest to pożądane tutaj).Odwołując się do typu klasy wewnętrznej w Scali
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)
To nie kompiluje i scala 2,8 narzeka:
type mismatch; found: sandbox.Outer#Inner
required: _81.Inner where val _81:sandbox.Outer
Od Programming Scala: Nested classes i A Tour of Scala: Inner Classes, wydaje mi się, że problemem jest to, że useInner
oczekuje jako argument Inner
instancji z konkretnego Outer
instancji .
Jakie jest prawdziwe wyjaśnienie i jak rozwiązać ten problem?
Czy to możliwe, zmodyfikować doBoolean zamiast useInner? –
Jeśli próbowano 'def doBoolean (x: y.Inner forSome {val y: Outer}): Boolean = x.enclosing.useInner (x)' (Egzystencjalne typy - Egistential Quantification over Values od odnośnika Scala), ale nie praca. –