2013-08-05 14 views

Odpowiedz

12

Słowo kluczowe type jest dla deklaracji typu aliasu, podobnie jak val i def dla deklaracji wartości i metody. W tym przypadku jest to alias typu abstrakcyjnego z ograniczeniami, więc jest elementem typu pewnego aliasu typu trait lub class - w zasięgu lokalnym nie może być abstrakcyjny i nie może mieć ograniczeń.

Typ Ident jest podtypem AnyRef i nadtypem Null.

AnyRef

AnyRef jest przodkiem wszystkich typów referencyjnych, wszystkie typy oprócz Int, Long, Char i tak dalej (prymitywów Java).

Null

Null jest podtypem wszystkich "pustych" typów. W rzeczywistości jest to podtyp wszystkich typów referencji.

Ponieważ wszystkie AnyRef są zerowalne, jedynym dodatkowym ograniczeniem z >: Null jest to, że Ident nie jest Nothing.

Zobacz Scala’s type hierarchy:

Scala’s type hierarchy

+0

Szybkie pytanie uzupełniające (bo jestem ciekawy), czy ta dolna granica nie jest zbyteczna? Ponieważ 'Null' jest podtypem wszystkich typów referencji, a typ ma już górną granicę zdefiniowaną jako * dowolny typ odniesienia *? –

+0

Dzięki, znam hierarchię, ale moje pytanie brzmiało, co oznacza to polecenie: – Pooya

+1

@ PatrykĆwiek: Chyba tak. Ale typ "Null" może być wymieniany jako wyraźne ostrzeżenie, że wartość może mieć wartość "null". – senia

1

W twoim przypadku Null jest podtypem Ident i AnyRef jest jego supertypem. W ten bez granic wspólny podtyp wszelkiego rodzaju jest Nothing, ale określenie to być Null, ze jest podtypem wszystkich obiektów, gdy nic nie jest podtypem wszystkiego (w tym Int, długie, etc ..)

Rzeczy takie jak Wartości Null i Nothing są używane w systemie typów, zasadniczo w wariancji typu (Contra/Co). Przykład:

sealed trait Container[+A >: Null <: AnyRef] 
case class Full[A >: Null <: AnyRef](value: A) extends Container[A] 
case object Empty extends Container[Null] 

Ten kompilator idealny

val c: Container[String] = Full("String") 
val e: Container[String] = Empty 

Ale to się nie powiedzie, ponieważ nasz dolny i górny jest Null jest AnyRef:

val ff: Container[Int] = Full(10) 
val f: Container[Int] = Empty 

Nie możemy umieścić Int tutaj beacuse to typ narusza ograniczenia

7

Aby dodać odpowiedź @ Senia jest: nie jest to typ deklaracja, jest to członek deklaracja abstrakcyjny typ, znalezione w kontekście jak

trait Foo { // or perhaps class 
    type Ident >: Null <: AnyRef 
} 

oznacza, że ​​każda konkretna implementacja Foo musi zdefiniować pewien typ jako Ident, a ten typ musi spełniać ograniczenia opisane w odpowiedzi @ senia.

+0

Tak, definicja tego typu była cechą – Pooya