加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 清单和抽象类型解析

发布时间:2020-12-16 18:12:16 所属栏目:安全 来源:网络整理
导读:当编译器需要为具有抽象类型参数的类解析清单时,我遇到了编译器问题.以下代码段显示了该问题 trait MyStufftrait SecurityMutatorFactory[X]{ def apply(x1:X,x2:X)}object Example{ trait LEdge[N] { type L1 } type MyEdge[X] = LEdge[X] { type L1 = Secu
当编译器需要为具有抽象类型参数的类解析清单时,我遇到了编译器问题.以下代码段显示了该问题

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]

都编译成功.

编辑

以下是为匿名类生成隐式清单失败的具体原因.
在语言规范类型中,BaseType {…}形式的exssions称为精炼类型.
根据语言规范,精炼类型的清单只是其基类的清单.然而,这无法进行类型检查,因为您要求使用Manifest [LEdge [MyStuff] {type L1 = SecurityMutatorFactory [X]}],但该算法正在返回Manifest [LEdge [MyStuff]].这意味着您只能在逆变位置中为具有细化类型的类型构造隐式清单.例如使用:

type MyEdge[X] = LEdge[X] { type L1 = SecurityMutatorFactory[X] } => AnyRef

在你的例子中允许它编译,虽然它显然不是你所追求的.

用于构造隐式清单的完整算法在语言规范的7.5节末尾给出.第6条涵盖了这个问题:

6) If T is a refined type T'{R},a manifest is generated for T’. (That is,refinements are never reflected in manifests).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读