Вместо неявного класса
implicit class fooSemigroup(foo: Foo) extends Semigroup[Foo] {
def combine(x: Foo, y: Foo) = Foo(x.v + y.v)
}
попробуйте неявный объект
implicit object fooSemigroup extends Semigroup[Foo] {
def combine(x: Foo, y: Foo) = Foo(x.v + y.v)
}
Однако, согласно совету Луиса, отдавайте предпочтение implicit val
экземплярам над implicit object
, иначе разрешение может привести к ambiguous implicit values
ошибка, например
trait SomeTrait[T] {
def f: T
}
trait ExtendedTrait[T] extends SomeTrait[T] {
def g: T
}
implicit object SomeStringObject extends SomeTrait[String] {
override def f: String = "from object f"
}
implicit object ExtendedStringObject extends ExtendedTrait[String] {
override def f: String = "from extended obj f"
override def g: String = "from extended obj g"
}
implicitly[SomeTrait[String]] // Error: ambiguous implicit values
, где полная ошибка состояния
Error:(15, 77) ambiguous implicit values:
both object ExtendedStringObject in class A$A7 of type A$A7.this.ExtendedStringObject.type
and object SomeStringObject in class A$A7 of type A$A7.this.SomeStringObject.type
match expected type A$A7.this.SomeTrait[String]
def get$$instance$$res0 = /* ###worksheet### generated $$end$$ */ implicitly[SomeTrait[String]];}
^