2013-02-03 7 views
6

Il compilatore mi sta dicendo che questo non può essere con un avviso di: "il tipo A controvariante si verifica in posizione covariante nel tipo> A <: Qualsiasi di tipo B." L'avviso è nel parametro type del metodo di composizione. Logicamente la definizione del tipo ha senso per me. Se il compilatore non ha remore con e quindi, perché il problema con il contrario?Perché il compilatore Scala dice che il tipo A controvariante si verifica in posizione covariante in tipo>: A <: Qualunque tipo B?

trait Foo[-A]{ 
    def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this 
    def andThen[B <: A](t: Foo[B]): Foo[B] 
} 

Tutto quello che serve è un esempio in cui si rompe. Quindi sono felice.

risposta

4

Come dice l'errore, l'annotazione della varianza di A è errata. Non è possibile utilizzare A in un tipo restituito che è una posizione covariante. Immagina di avere un altro metodo in Foo che utilizza A nella corretta posizione controvariante (come argomento):

trait Foo[-A] { 
    ... 
    def foo(a: A): Unit 
} 

Ora si può vedere come questo si blocca:

  • Foo[-A] implica che Foo[X] <: Foo[Y] se X >: Y
  • un valore restituito può essere un sottotipo del tipo di reso dichiarato
  • pertanto, se -A era legale qui, compose potrebbe restituire un Foo[A1] per qualche A1 >: A
  • dicono trait X e trait Y extends X { def bar() }
  • immaginare un Foo[Y] dove foo chiamate a.bar()
  • di conseguenza si spezzerebbe se compose fu permesso di tornare Foo[X]

Quindi per voi esempio per compilare, A deve essere invariato.

Problemi correlati