如果要确保可以将其参数添加在一起,该如何定义泛型函数?
def f[A <: (addition??)](first: A, second: A): Unit = println(first + second)
例如,通过扩展方法提供Semigroup类型类实例和infix+
运算符
trait Semigroup[A] {
def combine(x: A, y: A): A
}
case class Foo(v: Int)
case class Bar(a: String, b: String)
implicit val fooSemigroup: Semigroup[Foo] = (x: Foo, y: Foo) => Foo(x.v + y.v)
implicit val barSemigroup: Semigroup[Bar] = (x: Bar, y: Bar) => Bar(x.a + y.a, x.b + y.b)
implicit class SemigroupOps[A](x: A) {
def +(y: A)(implicit ev: Semigroup[A]): A = ev.combine(x, y)
}
Foo(41) + Foo(1) // res0: Foo = Foo(42)
Bar("He", "wo") + Bar("llo", "rld") // res1: Bar = Bar(Hello,world)
现在您的方法可以像这样被约束
def f[A](first: A, second: A)(implicit ev: Semigroup[A]): Unit =
println(first + second)
这个答案试图仅说明概念,因此在实践中,请注意Luis的评论并使用开箱即用的猫咪设施。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句