Ho cercato molto, ma non ho trovato nulla, qual è il significato di questo tipo di type declaration
in Scala?Qual è il significato di>: Null <: in Scala?
type Ident >: Null <: AnyRef
Ho cercato molto, ma non ho trovato nulla, qual è il significato di questo tipo di type declaration
in Scala?Qual è il significato di>: Null <: in Scala?
type Ident >: Null <: AnyRef
Parola chiave type
è per la dichiarazione di tipo alias, proprio come val
e def
sono per valore e dichiarazione del metodo. In questo caso è un alias di tipo astratto con vincoli, quindi è un membro di tipo di alcuni trait
o class
- l'alias di tipo in ambito locale non può essere astratto e non può avere vincoli.
Il tipo Ident
è un sottotipo di AnyRef
e il supertipo di Null
.
AnyRef
AnyRef
è un antenato di tutti i tipi di riferimento, tutti i tipi eccetto Int
, Long
, Char
e così via (primitive Java).
Null
Null
è sottotipo di tutti i tipi "nullable". In realtà è un sottotipo di tutti i tipi di riferimento.
Poiché tutti gli AnyRef
sono annullabili, l'unico vincolo aggiuntivo da >: Null
è che Ident
non è Nothing
.
Vedi Scala’s type hierarchy:
Nel tuo caso Null
è un sottotipo di Ident
e AnyRef
è il suo supertipo. In questo senza confini sottotipo comune di tutti i tipi è Nothing
, ma si specifica che sia Null
, con è un sottotipo di tutti gli oggetti in cui nulla è un sottotipo di tutto (incluso Int, Long, ecc ..)
Cose come Null and Nothing sono usati in Type System, fondamentalmente nella varianza di tipo (Contra/Co). Esempio:
sealed trait Container[+A >: Null <: AnyRef]
case class Full[A >: Null <: AnyRef](value: A) extends Container[A]
case object Empty extends Container[Null]
Questo compilatore perfetta
val c: Container[String] = Full("String")
val e: Container[String] = Empty
Ma questo non riesce, perché il nostro limite inferiore è nullo e tomaia è AnyRef:
val ff: Container[Int] = Full(10)
val f: Container[Int] = Empty
Non possiamo mettere Int
qui allucinante questo il tipo viola le contravvenzioni
Per aggiungere alla risposta di @ Senia: questo non è un tipo dichiarazione, si tratta di un membro dichiarazione tipo astratto, che si trova in un contesto come
trait Foo { // or perhaps class
type Ident >: Null <: AnyRef
}
e significa che qualsiasi implementazione concreta di Foo
deve definire un tipo per essere Ident
e questo tipo deve soddisfare i vincoli descritti nella risposta di @ senia.
Sì, questa definizione di tipo era in un tratto – Pooya
Una breve domanda di follow-up (perché sono curioso), non è il limite inferiore qui superfluo? Poiché "Null" è sottotipo di tutti i tipi di riferimento e il tipo ha già il limite superiore definito come * qualsiasi tipo di riferimento *? –
Grazie, conosco la gerarchia, ma la mia domanda era che cosa significa questo comando – Pooya
@ Patrykéwiek: credo di si. Ma il tipo 'Null' potrebbe essere citato come avvertimento esplicito che il valore potrebbe essere' null'. – senia