【问题标题】:Referencing generic type parameter shadowed by abstract type member引用被抽象类型成员遮蔽的泛型类型参数
【发布时间】:2015-05-10 05:47:59
【问题描述】:

有没有办法引用被同名抽象类型成员遮蔽的泛型类型参数?

假设我们有一个 trait 和扩展类:

trait Foo {
    type T
    var get: T = _
}

class Bar[X] extends Foo {
    override type T = X //We can set the type member by referencing the generic parameter X
}

class Baz[T] extends Foo {
    override type T = ??? //How can we reference the generic parameter T here?
}

显然,仅将泛型参数命名为不同于类型成员的名称通常没什么大不了的,但这并不总是最好的选择(例如,在使用外部库时)。有没有办法引用阴影泛型参数? Scala 规范在哪里描述了类型成员和泛型参数之间的这种交互?

【问题讨论】:

    标签: scala generics type-members


    【解决方案1】:

    即使没有覆盖特征的抽象成员,T 类型将始终引用继承的类型成员,而不是泛型参数。这是一个已知问题,归档为SI-8421。从建议的修复中,解释了为什么这是一个错误:

    将名称绑定到符号时,我们会在上下文中向上搜索 链。在每一步,我们首先查看当前范围。如果说 失败,我们寻找最近封闭的前缀的成员 与TemplatePackageDef 关联的上下文。

    然而,这意味着我们将在之前寻找一个继承的类型成员 找到一个同名的类类型参数,它在一个范围内 封闭上下文两层。

    所以也许在该问题解决后(标记为 2.12.0-M2),即使抽象类型成员被覆盖,也可以引用影子类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2013-09-13
      相关资源
      最近更新 更多