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: Aa: A with AnyRef,它可以工作:

scala> def foo[A](a: A with AnyRef) = {
     |   type F = Function1[_ >: a.type, Unit]
     | } 
foo: [A](a: A with AnyRef)Unit

为什么?限制的目的是什么?

4

1 回答 1

5

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

任何与任何参考

目前有可能在某些上下文中使用单例类型,但仅限于指向符合 AnyRef 的常量的标识符。此限制是由于 Any 没有 eq 方法,这是用于单例类型相等检查和模式匹配https://github.com/scala/scala/pull/3558的方法。这已在此处此处的邮件列表中进行了讨论,并且同意需要这样做。

于 2016-08-03T06:44:02.237 回答