Scala编译器在元组中作为参数装箱/取消装箱时表现得很奇怪。
考虑代码:
scala> class Test { def test(p: (Int, String)) = println(p) }
defined class Test
scala> classOf[Test].getMethods()(0)
res2: java.lang.reflect.Method = public void Test.test(scala.Tuple2)
scala> classOf[Test].getMethods()(0).getGenericParameterTypes
res3: Array[java.lang.reflect.Type] = Array(scala.Tuple2<java.lang.Object, java.lang.String>)
scala> // WTF?????? ^^^^^^^^^^^^^^^^
因此,我得到的是Object而不是Integer。我假设这在某种程度上与元组参数@specialized
有关,但无法解决如何避免/修复此问题。
它引起的问题 - 通过对方法签名的反射来重构方法参数是不可能的(例如在解析json时)。
即使有一种方法可以使用scala-reflect
获得正确的类型,但它没有多大帮助,因为有很多Java库(比如Jersey)只使用Java反射。
UPD:
好的,将Integer
(而非Int
)放入Tuple
即可。但为什么不自动完成呢?