Dużo szukałem, ale niczego nie znalazłem, jakie jest znaczenie tego typu type declaration
w Scali?Co to jest>: Null <: in Scala?
type Ident >: Null <: AnyRef
Dużo szukałem, ale niczego nie znalazłem, jakie jest znaczenie tego typu type declaration
w Scali?Co to jest>: Null <: in Scala?
type Ident >: Null <: AnyRef
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:
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
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.
Tak, definicja tego typu była cechą – Pooya
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 *? –
Dzięki, znam hierarchię, ale moje pytanie brzmiało, co oznacza to polecenie: – Pooya
@ PatrykĆwiek: Chyba tak. Ale typ "Null" może być wymieniany jako wyraźne ostrzeżenie, że wartość może mieć wartość "null". – senia