Я попытался создать псевдоним типа, связанный с зависимым типом _ >: a.type
.Почему компилятор Scala запрещает объявление подстановочного типа как супер тип параметра типа
Скала компилятор выдает сообщение об ошибке, что я не понял:
scala> def foo[A](a: A) = {
| type F = Function1[_ >: a.type, Unit]
| }
<console>:12: error: type mismatch;
found : a.type (with underlying type A)
required: AnyRef
Note that A is unbounded, which means AnyRef is not a known parent.
Such types can participate in value classes, but instances
cannot appear in singleton types or in reference comparisons.
type F = Function1[_ >: a.type, Unit]
^
Если я заменяю a: A
на a: A with AnyRef
, он работает:
scala> def foo[A](a: A with AnyRef) = {
| type F = Function1[_ >: a.type, Unit]
| }
foo: [A](a: A with AnyRef)Unit
Почему? Какова цель ограничения?
Я до сих пор не понимаю, почему это влияет на _>: a.type. Я думал, что экзистенциальный тип типа _>: a.type никогда не будет участвовать в проверке равенства типов. –
Я предполагаю, что контекст не рассматривается, когда применяется защита; будем надеяться, что один из гуру языка Скала уточнит. – devkat