2013-08-05 15 views

risposta

12

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:

Scala’s type hierarchy

+0

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 *? –

+0

Grazie, conosco la gerarchia, ma la mia domanda era che cosa significa questo comando – Pooya

+1

@ Patrykéwiek: credo di si. Ma il tipo 'Null' potrebbe essere citato come avvertimento esplicito che il valore potrebbe essere' null'. – senia

1

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

7

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.

+0

Sì, questa definizione di tipo era in un tratto – Pooya