Sto cercando di ottenere una migliore comprensione del seguente comportamento:tipo Scala limiti e varianza
scala> class C[-A, +B <: A]
<console>:7: error: contravariant type A occurs in covariant position
in type >: Nothing <: A of type B
class C[-A, +B <: A]
^
Tuttavia le seguenti opere:
scala> class C[-A, +B <% A]
defined class C
posso vedere che ci potrebbero essere problemi dalla la varianza delle variabili delimitate e delimitate è opposta, sebbene non sia chiaro su quale sia il problema specifico. Sono ancora meno chiaro sul perché cambiare il tipo associato a una vista associata rende le cose ok. In assenza di conversioni implicite applicabili, mi aspetto che le due definizioni abbiano in gran parte lo stesso effetto. Se mai, mi aspetterei che una vista sia destinata a offrire maggiori opportunità di malizia.
Per un po 'di background che definisce le classi che sono in qualche modo come funzioni, e volevo fare qualcosa di simile
CompositeFunc[-A, +B <: C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
Probabilmente
CompositeFunc[-A, +B <% C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
in realtà è preferibile, ma avrei ancora piace capire meglio cosa sta succedendo qui.
Intrigante ... ho speso 1 ora alla ricerca di un esempio in cui il tipo interruzioni di sicurezza con il tipo vincolato. Nessuna trovata :( – gzm0
Anche se c'era un esempio non corretto con il tipo rilegato, è difficile vedere come la sostituzione in una vista vincolata lo risolvesse. –
Sì, sono d'accordo, ma la differenza fondamentale è che la vista è vincolata si converte sempre in base ai tipi con cui è stata creata la classe, mentre questo non è necessariamente il caso con il tipo associato (dice la mia intuizione almeno ...) – gzm0