下面的代码引发了一个隐含的未找到错误,-Xlog-implicits
sbt选项解释为歧义,我在最后粘贴:
import scala.language.higherKinds
trait JsonOFormat[T]
trait BsonOFormat[T]
trait Codec[CTXO[_]]
implicit def jsonCodec: Codec[JsonOFormat] = new Codec[JsonOFormat] {}
implicit def bsonCodec: Codec[BsonOFormat] = new Codec[BsonOFormat] {}
trait CApply[T,N,+CTXO[_]] {
def apply(t: T): CTXO[N] = ???
}
object CApply {
class CApplyBuilder[CTXO[_]] {
def instance[T,N](implicit cApply: CApply[T,N, CTXO]) = new CApply[T,N,CTXO] {}
}
def ctx[CTXO[_]]: CApplyBuilder[CTXO] = new CApplyBuilder[CTXO]
implicit def default[T,N,CTXO[_]](implicit hc: Codec[CTXO]): CApply[T, N, CTXO] = new CApply[T,N,CTXO] {}
}
CApply.ctx[JsonOFormat].instance[String,Int]
//Information:(23, 34) A$A261.this.CApply.default is not a valid implicit
//value for A$A261.this.CApply[String,Int,A$A261.this.JsonOFormat] because:
//hasMatchingSymbol reported error: ambiguous implicit values:
//both method bsonCodec in class A$A261 of type => A$A261.this.Codec[A$A261.this.BsonOFormat]
//and method jsonCodec in class A$A261 of type => A$A261.this.Codec[A$A261.this.JsonOFormat]
//match expected type A$A261.this.Codec[CTXO]
//CApply.ctx[JsonOFormat].instance[String,Int]
^
解释是说我的CTXO
留给编译器作为参数解决(感染)。但这不正确我明确将JsonOFormat
设置为CTXO
。
当然,与大多数此类情况一样,删除CApply[T,N,+CTXO[_]]
上的协方差注释会使错误消失。但是我的库的其余部分现在取决于该注释。有没有一个解决方案可以保持Scala编译器和我同时开心?