Scala协方差丢失类型约束

时间:2017-09-21 19:14:17

标签: scala covariance type-parameter implicits

我想知道如何在尝试解决“错误位置问题”中的“Covariant类型参数”时保留我的类型约束。这是代码:

trait Converter[SourceType, +JobType <: ConverterJobType[SourceType]] {
   def convert[JT >: JobType](job: JT):String = job.someMethodFromJobType()// method is not accessible here. I would like to use JobType but actually job is treated like type Any.
}

object Converter{
   implicit object CSVConverter extends Converter[CSV, CSVConverterJobType]{
     def converter....
   }
 }

我需要协方差,以便可以查找我的隐含对象。

 case class CSVConverterJobType(...) extends ConverterJobType[SourceType]

 object Application {

    def process[T](job: List[T])(implicit 
       converter:Converter[T,ConverterJobType[T]]) = {...}

    val list:List[CSV] = ...
    process(list)

 }

为了process方法能够找到隐式....我需要制作第二个类型参数协变。但后来我无法在convert方法中使用实际的类型信息。

知道如何克服这个问题吗?

1 个答案:

答案 0 :(得分:2)

JT需要<: JobType才能使job.someMethodFromJobType()生效。如果JTJobType的任意超类型,那么它没有someMethodFromJobType()方法。

你应该将第二种类型的参数转换为类型成员,特别是如果每​​JobType只有一个SourceType(如果没有,隐式搜索无论如何都会因为它赢了而且## 39;知道选择哪个JobType

trait Converter[SourceType] {
  type JobType <: ConverterJobType[SourceType]
  def convert...
}

object Converter{
  implicit object CSVConverter extends Converter[CSV]{
    type JobType = CSVConverterJobType
    def convert....
  }
}