2010-09-03 23 views
6

Gram z scala (scala 2.8). Załóżmy, że mam klasę z zagnieżdżoną cechą i chcę użyć tej zagnieżdżonej cechy jako typu dla parametru w konstruktorze klasy. Czy to w ogóle jest możliwe? Jest to najbliżej Doszedłem:Zagnieżdżona cecha w konstruktorze klasy w scala

class OuterClass(traitParam:OuterClass#InnerTrait) { 
    trait InnerTrait { } 
    val y:InnerTrait = traitParam 
} 

Bez trzeciej linii, że nawet kompiluje, ale jak tylko próbuję faktycznie używać traitParam jako InnerTrait pojawia się błąd kompilatora:

type mismatch; found: OuterClass#InnerTrait required: OuterClass.this.InnerTrait.

Nie mogę dowiedzieć się, co (jeśli w ogóle) mógłbym zrobić. Wykonanie

class OuterClass(traitParam:OuterClass.this.InnerTrait) 

zamiast tego, jak może sugerować komunikat o błędzie, nie jest kompilowane. Czy mam inny wybór niż przeniesienie InnerTrait poza domenę OuterClass? Jeśli zastanawiasz się, dlaczego chciałbym to zrobić, odpowiedź brzmi, że w moim rzeczywistym kodzie, odpowiednik OuterClass ma parametry typu, które następnie będą używane w InnerTrait. Jeśli wyprowadzę go na zewnątrz, to muszę powtórzyć parametry typu za każdym razem, gdy odwołuję się do wewnętrznej cechy.

Odpowiedz

7

Zdarza się, że Scala ma typy zależne od ścieżki. Twój typ val y: InnerTrait jest specyficzny dla instancji, w której jest zawarty. OuterClass#InnerTrait jest typem nadrzędnym wszystkich InnerTrait istniejących dla wszystkich wystąpień OuterClass.

Try pracy z tego:

class OuterClass(traitParam: OuterClass#InnerTrait) { 
    trait InnerTrait { } 

    type IT = OuterClass#InnerTrait 

    def m1: IT = traitParam 
} 
1

OuterClass has type parameters which would then be used in InnerTrait

Więc to jest możliwe, aby mieć a: OuterClass i b: OuterClass taki sposób, że te parametry typu są różne. Na przykład:

abstract class OuterClass[T] { 
    val x: T 
} 

val a = new OuterClass[Int] { val x = 5 } 
val b = new OuterClass[String] { val x = "abc" } 

Tak oto zagadka ... InnerTrait musi być związany z wystąpieniem OuterClass, ponieważ każda instancja może mieć inny parametr typu. Jednak chcesz przekazać InnerTrait jako parametr konstruktora OuterClass, więc musisz skonstruować InnerTrait przed OuterClass. Ale ponieważ InnerTrait musi być związany z instancją OuterClass, to OuterClass musi zostać skonstruowany przed InnerClass, zamieniając to w problem z jajkiem kurzego &.

Jest coś dziwnego w tym projekcie, więc sugeruję, aby przemyśleć to jeszcze raz.

Powiązane problemy