case class A(i: Int)
trait B
val c = new A(1) with B
c match {
case A(1) with B => true
case _ =>
}
So, is there any way to do this?
scala> trait Foo
defined trait Foo
scala> case class Fooz(s: String)
defined class Fooz
scala> class Foob extends Fooz("goo") with Foo
defined class Foob
scala> val a = Fooz("foo")
a: Fooz = Fooz(foo)
scala> val b = new Foob
b: Foob = Fooz(goo)
scala> def f(x: Fooz) = x match {
| case Fooz(y) if x.isInstanceOf[Foo] => s"Foob $y"
| case Fooz(y) => s"Only Fooz $y"
| }
f: (x: Fooz)String
scala> f(a)
res0: String = Only Fooz foo
scala> f(b)
res1: String = Foob goo
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Foob extends Fooz("goo") with Foo
object Foob {
def unapply(x: Fooz) = x match {
case _: Foo => Some(x)
case _ => None
}}
// Exiting paste mode, now interpreting.
defined class Foob
defined module Foob
scala> def f(x: Fooz) = x match {
| case Foob(y) => s"Foob $y"
| case Fooz(y) => s"Only Fooz $y"
| }
f: (x: Fooz)String