路径相关类型很有用:
trait Sys {
type Global
}
def foo[S <: Sys](system: S)(global: system.Global) = ()
为什么这对构造函数不起作用?
class Foo[S <: Sys](val system: S)(val global: system.Global)
还是我只是做错了?
路径相关类型很有用:
trait Sys {
type Global
}
def foo[S <: Sys](system: S)(global: system.Global) = ()
为什么这对构造函数不起作用?
class Foo[S <: Sys](val system: S)(val global: system.Global)
还是我只是做错了?
这对我来说似乎是一个错误。编辑:找到了,这是SI-5712。
2.9 SLS 的§5.3 节说:
(ps1)。. . (psn) 是类的主要构造函数的形式值参数子句。形式值参数的范围包括所有后续参数部分和模板 t 。
有一个例外:
但是,形式值参数可能不构成任何父类或类模板 t 成员的类型的一部分。
但是它说它不能是任何父类或成员的类型的一部分,也不能是以下任何参数部分的一部分,因此它似乎并没有禁止参数组之间的路径依赖类型。
您可以使用辅助构造函数解决此问题:
class Foo[S <: Sys] private[this] () {
def this(system: S)(global: system.Global) = this
}
编辑:这个辅助构造函数的解决方法不是很好:暴露system
或global
变得非常困难,因为只有主构造函数可以声明val
s。
一个演员表的例子:
class Foo[S <: Sys] private[this] () {
private[this] var _system: S = _
private[this] var _global: system.Global = _
def this(system0: S)(global0: system0.Global) = {
this
_system = system0
_global = global0.asInstanceOf[system.Global]
}
lazy val global: system.Global = _global
lazy val system: S = _system
}
但这越来越糟糕了。@senia 的建议要好得多。