Scala:使用Int调用fun时类型不匹配

时间:2017-05-31 07:57:49

标签: arrays scala

由于我使用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:_ *)

为什么会发生此错误?

2 个答案:

答案 0 :(得分:3)

selected的第二个参数的类型为invoke()。这意味着,传递的数组类型应该扩展Array[_ <: Object]。 Scala ObjectObject的同义词,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(或DoubleLong等等),而是有一个更简单的解决方案:

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: _*)