scala – 依赖类型不适用于构造函数?
路径相关类型很有用:
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节说:
有一个例外:
但是它表示它不能是任何父类或成员的类型的一部分,而不是以下任何参数部分,因此它似乎不禁止参数组之间的路径相关类型. 你可以用二次构造函数来解决这个问题: class Foo[S <: Sys] private[this] () { def this(system: S)(global: system.Global) = this } 编辑:这个辅助构造函数解决方法不是很好:暴露系统或全局变得非常困难,因为只有主构造函数才能声明vals. 一个演员的例子: 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的建议好多了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |