case class Foo(a: String, b: String) object Bar { def unapply(s: String): Option[Long] = try { Some(s.toLong) } catch { case _ => None } } object Test { def main(args: Array[String]): Unit = { val f = Foo("1", "2") f match { case Foo(Bar(1), Bar(2)) => 1 case Foo(Bar(i), Bar(j)) if i >= 0 => 2 case _ => 3 } } }