我想知道如何在尝试解决“错误位置问题”中的“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
方法中使用实际的类型信息。
知道如何克服这个问题吗?
答案 0 :(得分:2)
JT
需要<: JobType
才能使job.someMethodFromJobType()
生效。如果JT
是JobType
的任意超类型,那么它没有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....
}
}