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

Scala编译器为元组[Int,\ux]生成错误的方法签名,scala,reflection,scala-compiler,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[T

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??????                                      ^^^^^^^^^^^^^^^^
scala>类测试{deftest(p:(Int,String))=println(p)}
定义类测试
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)
scala>//WTF^^^^^^^^^^^^^^^^
因此,我得到的是对象而不是整数。我假设这与tuple参数是
@specialized
有关,但我无法理解如何避免/修复这一问题

它引起的问题——不可能通过对方法签名的反射(例如,在解析json时)来重构方法参数

即使有办法通过
scala reflect
获得正确的类型,也没有多大帮助,因为有很多Java库(比如Jersey)只使用Java反射

UPD:
好的,将一个
整数
(而不是
Int
)放入
元组
工作正常。但为什么它不是自动完成的?

你的问题是什么?@MichaelZajac,为什么编译器生成错误的代码,以及如何修复/解决这个问题?很好地看到了这一点,虽然我了解装箱是如何工作的,但我仍然不明白为什么要用Object而不是正确的类型生成代码:)