final object Test extends java.lang.Object with Application { class Foo(val s: String, val n: Int) extends java.lang.Object { }; def foo[A >: Nothing <: Any, B >: Nothing <: Any, C >: Nothing <: Any] (unapply1: (A) => Option[(B, C)], v: A): Unit = unapply1.apply(v) match { case Some((fst @ _, snd @ _)) => scala.Predef.println(scala.Tuple2.apply[java.lang.String, java.lang.String]("first: ".+(fst), " second: ".+(snd))) case _ => scala.Predef.println(":(") } Test.this.foo[Test.Foo, String, Int]({ ((eta$0$1: Test.Foo) => Test.this.Foo.unapply(eta$0$1)) }, Test.this.Foo.apply("this might be fun", 10)); final object Foo extends java.lang.Object with ((String, Int) => Test.Foo) { def unapply(x$0: Test.Foo): Some[(String, Int)] = scala.Some.apply[(String, Int)](scala.Tuple2.apply[String, Int](x$0.s, x$0.n)); def apply(s: String, n: Int): Test.Foo = new Test.this.Foo(s, n) } }