有没有办法引用由同名抽象类型成员遮蔽的泛型类型参数?
假设我们有一个特征和扩展类:
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规范中,类型成员和通用参数之间的交互是什么?
答案 0 :(得分:1)
即使没有覆盖特征的抽象成员,类型T
也将始终引用继承的类型成员,而不是泛型参数。这是一个已知问题,提交为SI-8421。从提议的修复程序中,解释了为什么这是一个错误:
将名称绑定到符号时,我们会搜索上下文 链。在每一步,我们首先查看当前范围。如果说 失败,我们寻找最近的封闭前缀的成员 与
Template
或PackageDef
相关联的上下文。但是,这意味着我们之前会寻找一个继承的类型成员 找到一个同名的类类型参数,它在一个范围内 将上下文封闭两个层次。
所以也许在问题解决后(标记为2.12.0-M2),即使抽象类型成员被覆盖,也可以引用阴影类型。