引用由抽象类型成员隐藏的泛型类型参数

时间:2015-05-07 22:21:40

标签: scala generics type-members

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

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

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规范中,类型成员和通用参数之间的交互是什么?

1 个答案:

答案 0 :(得分:1)

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

  

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

     

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

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