协方差注释会引发错误的隐式歧义错误

时间:2018-01-14 21:18:36

标签: scala covariance implicit

下面的代码引发了一个隐含的未找到错误,-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编译器和我同时开心?

0 个答案:

没有答案