1

Я попытался создать псевдоним типа, связанный с зависимым типом _ >: 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 

Почему? Какова цель ограничения?

ответ

5

См: http://docs.scala-lang.org/sips/pending/42.type.html

Любой против AnyRef

В настоящее время существует возможность использовать одноэлементные типы в некоторых контекстах, но только на идентификаторы, которые указывают на константу, которая соответствует AnyRef. Это ограничение связано с тем, что Any не имеет метода eq, который используется для проверки равенства одноточечного типа и соответствия шаблону https://github.com/scala/scala/pull/3558. Это обсуждалось в списке рассылки here и here, и есть согласие, что это необходимо сделать.

+0

Я до сих пор не понимаю, почему это влияет на _>: a.type. Я думал, что экзистенциальный тип типа _>: a.type никогда не будет участвовать в проверке равенства типов. –

+0

Я предполагаю, что контекст не рассматривается, когда применяется защита; будем надеяться, что один из гуру языка Скала уточнит. – devkat

 Смежные вопросы

  • Нет связанных вопросов^_^