【发布时间】:2019-07-01 14:14:42
【问题描述】:
我正在构建一个为给定 Config[T] 生成 Product[T] 实例的工厂。有两种类型的配置:
trait Config[T]
case class SimpleConfig[T]() extends Config[T]
case class SpecialConfig[T <: Special]() extends Config[T]
工厂只是在配置上匹配并委托给两个子工厂:
def factory[T](config: Config[T]): Product[T] = config match {
case c: SimpleConfig[_] => buildA[T](c)
case sc: SpecialConfig[_] => buildASpecial[T](sc)
}
def buildA[X](c: Config[X]): Product[X] = ???
def buildASpecial[X <: Special](sc: SpecialConfig[X]): Product[X] = ???
但是,这不会编译,因为编译器无法验证传递给buildASpecial() 的配置的类型参数是Special 的子类型。看起来它可以实际验证参数 sc 是 SpecialConfig[X] 和 X <: Special 但它没有看到 X 实际上等于 T 所以它可以得出结论 T 也是Special.
也许我遗漏了一些东西,但上面的调整对我来说似乎是有效的。是否可以在没有显式转换的情况下解决此问题?
【问题讨论】:
标签: scala types pattern-matching