我希望有一个类,它接受一个类依赖类型的参数,正如我经常为方法所做的那样。但令我惊讶的是,这并没有起作用:
scala> trait Compiler { trait Config }
defined trait Compiler
// works fine, as expected
scala> def f(c: Compiler)(conf: c.Config) = {}
f: (c: Compiler)(conf: c.Config)Unit
scala> class F(val c: Compiler)(val conf: c.Config)
<console>:8: error: not found: value c
class F(val c: Compiler)(val conf: c.Config)
^
为什么呢?有没有解决方法?
答案 0 :(得分:5)
似乎可以接受的解决方法(无法在没有额外强制转换的情况下创建无效F
):
class F private (val c: Compiler)(_conf: Compiler#Config) {
def conf = _conf.asInstanceOf[c.Config]
}
object F {
def apply(c: Compiler)(conf: c.Config) = new F(c)(conf)
}
答案 1 :(得分:2)
至于为什么路径依赖类型在类主构造函数中不起作用 答案在Scala语言规范的第5.3节中给出:
正式值参数可能不构成任何类型的一部分 父类或类模板的成员
(虽然看起来“类模板的成员”仅表示构造函数参数部分中定义的成员)。
但是一个类可能有额外的构造函数,可以编写一个不需要额外的强制转换和对象的变通方法:
class F private (val conf: Compiler#Config, val c: Compiler) {
def this(c: Compiler)(conf: c.Config) = this(conf, c)
}