如何创建可应用于包含相同参数的两种或多种类型的泛型函数?

alt*_*-f4 3 generics scala

假设我们有两个案例类 Woof 和 Meow

case class Meow(a: String, b: String)
case class Woof(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)

我们想创建一个函数 foo 将 a 与 b 连接起来,并且对 Woof 和 Meow 都通用(有点),例如:

def foo[T](meowOrWoof: T) = meowOrWoof.a + meowOrWoof.b
Run Code Online (Sandbox Code Playgroud)

当然,这不会编译,因为 a 和 b 都不是 T 的参数。

我尝试过的一件事是创建一个特征,如:

trait Pets[T] {
    def foo[T](someClass: T): String
  }

  case class Meow(a: String, b: String) extends Pets[Meow] {
    override def foo[T](someClass: T) = a + b
  }
  case class Woof(a: String, b: String) extends Pets[Woof] {
    override def foo[T](someClass: T) = a + b
  }
Run Code Online (Sandbox Code Playgroud)

但是在这里我们必须多次创建该函数,即使它具有相同的实现。

有没有另一种方法可以创建同时适用于 Meow 和 Woof 的函数 foo,并将 a 与 b 连接起来?

jwv*_*wvh 6

如果你的案例类可以extend是一个共同的特征或抽象类......

abstract class AB {
  val a:String
  val b:String
}
case class Meow(a: String, b: String) extends AB
case class Woof(a: String, b: String) extends AB

def foo(ab:AB):String = ab.a + ab.b

foo(Woof("growl","bark"))  //res0: String = growlbark
Run Code Online (Sandbox Code Playgroud)