繁体   English   中英

依赖类型不适用于构造函数?

[英]Dependent types not working for constructors?

路径相关类型很有用:

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
}

编辑 :这个辅助构造函数的解决方法不是很好:暴露systemglobal变得非常困难,因为只有主构造函数可以声明val

演员的一个例子:

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的建议要好得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM