Scala编译器为元组[Int,_]生成错误的方法签名

时间:2017-03-11 00:49:34

标签: scala reflection scala-compiler

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即可。但为什么不自动完成呢?

0 个答案:

没有答案