Я пытаюсь лучше понять следующее поведение:
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]
^
Однако работает следующее:
scala> class C[-A, +B <% A]
defined class C
Я вижу, что могут быть проблемы из-за того, что дисперсия ограничивающих и ограниченных переменных противоположна, хотя мне не ясно, в чем заключается конкретная проблема. Я еще менее понимаю, почему изменение типа, связанного с представлением, делает все в порядке. В отсутствие применимых неявных преобразований я ожидаю, что два определения будут иметь в основном одинаковый эффект. Во всяком случае, я ожидаю, что вид обязательно предоставит больше возможностей для вреда.
В качестве предыстории я определяю классы, которые в некотором роде похожи на функции, и я хотел сделать что-то вроде
CompositeFunc[-A, +B <: C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
возможно
CompositeFunc[-A, +B <% C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
на самом деле предпочтительнее, но я все же хотел бы лучше понять, что здесь происходит.