Я строю фабрику, которая производит экземпляр Product [T] для данного Config [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
.
Может быть, я что-то упустил, но вышеприведенная оценка мне кажется действительной.Можно ли это исправить без явного приведения?