我会确保方法只接受 A
或 B
或 C
的实例。而且我不想修改A
、B
和C
的代码。
case class A
case class B
case class C
def method(aOrbOrc: Any) = ???
// method("toto") should not compile
最佳答案
你可以使用类型类。
case class A(s: String)
case class B(i: Int)
case class C(i1: Int, i2: Int)
// Type Class
trait ABC[T] {
def bar(t: T): String
}
// Instances
implicit object ABC_A extends ABC[A] {
override def bar(t: A): String = "A : s = " + t.s
}
implicit object ABC_B extends ABC[B] {
override def bar(t: B): String = "B : i = " + t.i
}
implicit object ABC_C extends ABC[C] {
override def bar(t: C): String = "C : i1 = " + t.i1 + ", i2 = " + t.i2
}
def method[T](abc: T)(implicit instance: ABC[T]) = println(instance.bar(abc))
method(A("AAAAA")) // => A : s = AAAAA
method(B(123)) // => B : i = 123
method(C(9, 5)) // => C : i1 = 9, i2 = 5
method(1) // compilation error
关于scala - 在 Scala 中应该只接受 A 或 B 或 C 实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982724/