scala – 类别别名中的差异注释
最近我注意到方差注释可以在类型别名中使用.以下是Predef的示例:
type Function[-A,+B] = Function1[A,B] 我开始想,可以在哪里使用.显然,您不能将方差改为相反,或使不变类型表现为共同或逆向.编译器会抛出一个错误,像这样 scala> type BrokenFunc[+T,-R] = Function1[T,R] <console>:7: error: covariant type T occurs in contravariant position in type [+T,-R]T => R of type BrokenFunc 但是,您可以使一些变体类型的行为类似于不变式(至少编译器不会与之进行争论).所以,我试图做一个不变版本的列表 scala> type InvList[T] = List[T] defined type alias InvList 但是这个新的不变列表仍然表现得像原始的协变版本: scala> val l: InvList[String] = List("foo") l: InvList[String] = List(foo) scala> val anyList: InvList[Any] = l anyList: InvList[Any] = List(foo) 那么,我错过了什么?类型别名中方差注释的目的是什么?你可以给出一个带有方差注释的类型别名的例子,这将与原始类型不同. 解决方法
所以,我不知道肯定,但我会提供一个可能的解释.
Scala中的类别别名相当“弱”它们不完全创建新类型,只是编写旧类型(和新路径依赖类型)的新方法;这意味着如果你定义 type InvList[T] = List[T] 并写入InvList [T],就好像你写了List [T];这就是为什么InvList [Int]<:InvList [Any],因为被重写,这只是List [Int]:列表[Any].我实际上并不确切地确定“弱”Scala类型别名是什么...他们比Haskell的一些强大,因为依赖于路径的类型,但比类声明弱.也许别人可以进一步解释. 那么,为什么Scala允许你把方差注释放在那里,如果它只是忽略它们,还是重写类型?它是类型成员.这是你可以说的 trait A { type F[+T] } 并要求这些实现符合T方差,以便允许 trait B extends A { type F[+T] = List[T] } 但不是 trait C extends A { type F[T] = Function[T,T] } 或者,从Scala Language Spec S4.3的这个句子.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |