由于我使用Scala的经验有限,我的代码中存在错误:
class TagCalculation {
def test_string(arg1: String,arg2: String) = arg1 + " " + arg2
def test_int(arg1: Int,arg2: Int) = arg1 + arg2
}
val get_test = new TagCalculation
//test int, by the way it's Ok for String
val test_int_para = Array(1,2)
val argtypes2 = test_int_para.map(_.getClass)
val method2 = get_test.getClass.getMethod("test_int", argtypes2: _*)
method2.invoke(get_test,test_int_para: _*)
输出:
console>:29:错误:类型不匹配;
发现:数组[Int]
必需: 数组[_&lt ;: Object]
method2.invoke(get_test,test_int_para:_ *)
为什么会发生此错误?
答案 0 :(得分:3)
selected
的第二个参数的类型为invoke()
。这意味着,传递的数组类型应该扩展Array[_ <: Object]
。 Scala Object
是Object
的同义词,AnyRef
不是Int
子类型,但实际上是AnyRef
子类型。以下是更详细的说明:http://docs.scala-lang.org/tutorials/tour/unified-types.html
您通过了AnyVal
作为第二个参数,这就是错误发生的原因。您需要改为Array[Int]
。
所以,你真正需要的是明确地传递Array[_ <: Object]
个Integer
包装器。您可以使用AnyRef
方法将所有数组Int
转换为Integer
。然后,Integer.valueOf
方法就可以了:
invoke()
答案 1 :(得分:0)
不是使用Integer.valueOf
(或Double
或Long
等等),而是有一个更简单的解决方案:
val test_int_para = Array[AnyRef](1,2)
或者,如果您已经拥有val params: Array[Any]
,例如val params = Array(1,"string",df)
:
val paramsAsObjects = params.map(_.asInstanceOf[AnyRef])
someMethod.invoke(someObject, paramsAsObjects: _*)