scala – 清单和抽象类型解析
当编译器需要为具有抽象类型参数的类解析清单时,我遇到了编译器问题.以下代码段显示了该问题
trait MyStuff trait SecurityMutatorFactory[X]{ def apply(x1:X,x2:X) } object Example{ trait LEdge[N] { type L1 } type MyEdge[X] = LEdge[X] { type L1 = SecurityMutatorFactory[X]} val a:Manifest[MyEdge[MyStuff]] = implicitly[Manifest[MyEdge[MyStuff]]] } 结果,编译器抛出以下类型错误: type mismatch; found : scala.reflect.Manifest[LEdge[MyStuff]] required: Manifest[MyEdge[MyStuff]] Note: LEdge[MyStuff] >: MyEdge[MyStuff],but trait Manifest is invariant in type T. You may wish to investigate a wildcard type such as `_ >: MyEdge[MyStuff]`. (SLS 3.2.10) val a:Manifest[MyEdge[MyStuff]] = implicitly[Manifest[MyEdge[MyStuff]]] 编译器级别发生了什么? ^ 解决方法
正如其他人所说,问题来自于此
type MyEdge[X] = LEdge[X] { type L1 = SecurityMutatorFactory[X] } 表单类型F [X] = …的声明引入了类型同义词,即现有类型的新名称.他们不构建新的特征或类.但是,LEdge [X] {type L1 = SecurityMutatorFactory [X]}正在构建一个新的匿名类.所以你的例子大致相当于 trait MyEdge[X] extends LEdge[X] { type L1 = SecurityMutatorFactory[X] } (这是你最想要的)但是示例中的原始定义是定义匿名类的同义词,而不是定义新类MyEdge [X].因此在示例中,新类实际上不称为MyEdge.构造隐式清单时,编译器将类型同义词替换为基础类型,但无法为其构造清单,因为该类型是匿名的. 用普通的扩展名定义替换MyEdge声明: trait MyEdge[X] extends LEdge[X] { type L1 = SecurityMutatorFactory[X] } 或与普通类型同义词: type MyEdge[X] = LEdge[X] 都编译成功. 编辑 以下是为匿名类生成隐式清单失败的具体原因. type MyEdge[X] = LEdge[X] { type L1 = SecurityMutatorFactory[X] } => AnyRef 在你的例子中允许它编译,虽然它显然不是你所追求的. 用于构造隐式清单的完整算法在语言规范的7.5节末尾给出.第6条涵盖了这个问题:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |