gpt4 book ai didi

scala - list 和抽象类型解析

转载 作者:行者123 更新时间:2023-12-03 02:27:40 24 4
gpt4 key购买 nike

当编译器需要解决具有抽象类型参数的类的 list 时,我遇到了编译器问题。以下代码片段显示了该问题

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] }

type F[X] = ... 形式的声明引入了类型同义词,即现有类型的新名称。他们不构建新的特征或类别。但是,LEdge[X] { type L1 = SecurityMutatorFactory[X] } 正在构造一个新的匿名类。所以你的例子大约相当于

trait MyEdge[X] extends LEdge[X] { type L1 = SecurityMutatorFactory[X] }

(这可能是您想要的),但示例中的原始定义是定义匿名类的同义词,而不是定义新类 MyEdge[X]。因此,在示例中,新类实际上并不名为 MyEdge。构造隐式 list 时,编译器将类型同义词替换为基础类型,但无法为其构造 list ,因为该类型是匿名的。

用普通扩展定义替换 MyEdge 声明:

trait MyEdge[X] extends LEdge[X] { type L1 = SecurityMutatorFactory[X] }

或使用普通类型同义词:

type MyEdge[X] = LEdge[X]

都编译成功。

编辑

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

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

在您的示例中允许它编译,尽管这显然不是您想要的。

构建隐式 list 的完整算法在语言规范第 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).

关于scala - list 和抽象类型解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18657112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com