如何解决类型的Diverging隐式扩展

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决类型的Diverging隐式扩展相关的知识,希望对你有一定的参考价值。

我想让我的案例类Event[K, V]总是按密钥K订购。但我需要能够比较不同值的事件V。如何解决这种分歧的隐式扩张?

import scala.math.Ordering

object Event {
  case class Event[K, V](key: K, value: V)
    (implicit o: Ordering[K]) extends Ordered[Event[K, _]] {
      override def compare(that: Event[K, _]): Int = o.compare(key, that.key)
    }
}

object Main extends App {
  // mimicking a librarys function 
  def lala[O](e: O)(implicit ordering: Ordering[O]) = ???

  val b = Event.Event("a", 12) <= Event.Event("a", 11.99)    
  lala(Event.Event("a", 12))
}

由于这种不同的隐式扩展,对lala的调用无法编译:

diverging implicit expansion for type   
scala.math.Ordering[Event.Event[String,Int]] starting with method $conforms 
in object Predef lala(Event.Event("a", 12))
答案

如果你的库方法需要你的类型的Ordering实例,你应该提供扩展的Ordered的indead,这从编译器的角度来看是完全不公平的。请尝试以下方法:

case class Event[K, V](key: K, value: V)

object Event {
  implicit def eventOrdering[K, V](implicit o: Ordering[K]) =
    new Ordering[Event[K, V]] {
      // ...
    }
}

以上是关于如何解决类型的Diverging隐式扩展的主要内容,如果未能解决你的问题,请参考以下文章

如何将可空类型隐式转换为不可空类型

深入浅出JavaScript中的隐式转换

Scala隐式转换

C#错误(无法将类型'string'隐式转换为'int')[重复]

如何强制编译器显示隐式构造函数

使用隐式转换扩展泛型 Serializable