假设我们有两个案例类 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 连接起来?
如果你的案例类可以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)