2012-07-01 13 views
8

Perché posso dire che un campo tipo ha il tipo di una classe con un'altra classe mista (quando solo i tratti possono essere mescolati in una classe)?Perché è possibile mischiare le classi in un campo tipo?

Esempio:

scala> class A 
defined class A 

scala> class B extends A 
defined class B 

miscelazione in B-A non è consentito:

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

Ma questo è possibile:

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

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

Sembra un insetto per me. –

risposta

3

questo è chiamato un compound type e non ha nulla a fare con i tratti. Ti permette di esprimere che un tipo è un sottotipo di molti altri tipi.

Per ulteriori informazioni su dove possono verificarsi, vedere Scala tag info nella sezione "Gestione tipi".

+0

Questo non risponde alla domanda: perché è possibile? –

+1

@RobinGreen: perché non dovrebbe essere possibile? 'nuova A con B' significa * mixin *' B' in 'A',' tipo T = A con B' significa 'T' è di tipo' A' * e * 'B'. – sschaef

+2

@Antoras - la domanda è valida. Dal momento che non puoi _stanziare_ un mix di due classi, qual è una situazione utile in cui puoi avere un tipo composto di due classi? Mentre l'intero sistema è ancora sano, si potrebbe sostenere che quando in "A con B" questi due tipi sono noti al compilatore per riferirsi alle classi, potrebbe emettere almeno un avvertimento. –

6

C'è una differenza tra l'istanziazione del mixin e la definizione del tipo composto. Innanzitutto tipo A with B esiste ed è esattamente il tipo B, purtroppo è perfettamente legale in scala per scrivere

val x: A with B = new B 

come

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

quanto descrive esattamente lo stesso tipo. Stai introducendo delle restrizioni nel tipo di valore che puoi assegnare a una variabile di quel tipo. Queste restrizioni sono sempre valide in questo caso.

Inoltre, è necessario tenere presente che Scala non ha necessariamente bisogno di un tipo per essere abitato - ovvero il tipo inferiore Nothing non può essere istanziato affatto. Ma come Nothing è un sottotipo di ogni tipo che può essere espresso in Scala è anche valido per creare espressioni come

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

Nothing è un sottotipo di AnyRef with AnyVal per definizione così che typechecks dichiarazione.

Problemi correlati