2012-07-01 15 views
8

Dlaczego mogę powiedzieć, że pole typu ma typ klasy z inną mieszaną klasą (gdy tylko klasy mogą być mieszane w klasie)?Dlaczego można mieszać w klasach w polu typu?

Przykład:

scala> class A 
defined class A 

scala> class B extends A 
defined class B 

Mieszanie w B do A nie jest dozwolone: ​​

scala> new A with B 
<console>:10: error: class B needs to be a trait to be mixed in 
      new A with B 
         ^

Ale to jest możliwe:

scala> class E {type T = A with B} 
defined class E 

scala> new E 
res1: E = [email protected] 
+0

Wygląda jak błąd. –

Odpowiedz

3

To się nazywa compound type i nie ma nic rób z cechami. Pozwala ci wyrazić, że typ jest podtypem kilku innych typów.

Aby uzyskać więcej informacji, gdzie mogą wystąpić, patrz sekcja Scala tag info w rozdziale "Obsługa typów".

+0

To nie odpowiada na pytanie: dlaczego jest to możliwe? –

+1

@RobinGreen: Dlaczego nie powinno być to możliwe? 'nowy A z B' oznacza * mixin *' B' na 'A',' typ T = A z B' oznacza 'T' ma typ' A' * i * 'B'. – sschaef

+2

@ Antoras - pytanie jest prawidłowe. Ponieważ nie możesz _instantiate_ a mix dwóch klas, jaka jest przydatna sytuacja, w której możesz mieć złożony typ dwóch klas? Podczas gdy cały system jest nadal w porządku, można argumentować, że gdy w 'A z B' te dwa typy są znane kompilatorowi w odniesieniu do klas, może on przynajmniej wysyłać ostrzeżenie. –

6

Istnieje różnica między instancją mixin a definicją typu złożonego. Przede wszystkim od rodzaju A with B istnieje i jest dokładnie taki typ B, niestety jest to całkowicie legalne w Scali napisać

val x: A with B = new B 

jak

val y: Any with AnyRef with A with B = new B 

gdyż opisuje dokładnie tego samego typu. Po prostu wprowadzasz ograniczenia w typie wartości, którą możesz przypisać do zmiennej tego typu. Te ograniczenia oczywiście zawsze będą obowiązywały w takim przypadku.

Ponadto należy pamiętać, że Scala niekoniecznie musi być typu zamieszkanego - tj. Dolny typ Nothing nie może być w ogóle utworzony. Ale jak Nothing jest podtypem każdego typu, które mogą być wyrażone w Scala jest jeszcze ważne, aby napisać wyraz jak

def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!") 

Nothing jest podtypem AnyRef with AnyVal definicji zatem, że typechecks deklaracji.

Powiązane problemy