使用路径相关类型作为类参数

时间:2015-09-24 14:20:38

标签: scala

我希望有一个类,它接受一个类依赖类型的参数,正如我经常为方法所做的那样。但令我惊讶的是,这并没有起作用:

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)
                                          ^

为什么呢?有没有解决方法?

2 个答案:

答案 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)
}