是否有一种简单的方法来检查某个实例是否是Scala中的FunctionX?
是否有比下面所示的解决方案更详细的解决方案来检查实例是否为Function0/Function1是否有一种简单的方法来检查某个实例是否是Scala中的FunctionX?,scala,reflection,types,Scala,Reflection,Types,是否有比下面所示的解决方案更详细的解决方案来检查实例是否为Function0/Function1 def isFunction(x: Any) = x match { case x: Function0[_] => true case x: Function1[_,_] => true case x: Function2[_,_,_] => true case x: Function3[_,_,_,_] =>
def isFunction(x: Any) = x match {
case x: Function0[_] => true
case x: Function1[_,_] => true
case x: Function2[_,_,_] => true
case x: Function3[_,_,_,_] => true
case x: Function4[_,_,_,_,_] => true
case x: Function5[_,_,_,_,_,_] => true
case x: Function6[_,_,_,_,_,_,_] => true
case x: Function7[_,_,_,_,_,_,_,_] => true
case x: Function8[_,_,_,_,_,_,_,_,_] => true
case x: Function9[_,_,_,_,_,_,_,_,_,_] => true
case x: Function10[_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function11[_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function12[_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function13[_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function14[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function15[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function16[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function17[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function18[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function19[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function20[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function21[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case x: Function22[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_] => true
case _ => false
}
val x = () => 4
println(isFunction(x))
你的意思是给定:
scala> val f = (i: Int, j: Int) => i + j
f: (Int, Int) => Int = <function2>
?
我认为这是“容易”的方式,尽管它可能比你想的更冗长。但是,没有可以测试的基类,也没有任何其他属性。。。但是我关心的是这个解决方案的性能!很自然,但您的用户故事“没有那么冗长”。也许全面的Java8支持在将来会有所帮助。这也有可能是性能不会被订单关闭。
scala> val r = "scala.*Function\\d+".r
r: scala.util.matching.Regex = .*Function\d+
scala> def test(a: Any): Boolean = { def t(k: Class[_]): Boolean = k.getName match { case r() => true case _ => if (k.getSuperclass != null) t(k.getSuperclass) else false } ; t(a.getClass) }
test: (a: Any)Boolean
scala> test(f)
res1: Boolean = true