Scala:如何使用mix(Int,string,list)调用fun来修复java.lang.NoSuchMethodException

时间:2017-06-01 00:56:01

标签: scala

让我代码发言:)

 class TagCalculation {
    def test_string(arg1: String,arg2: String) = arg1 + " " + arg2
    def test_int(arg1: Int,arg2: Int) = arg1 + arg2
    def test_mix1(arg1:Int,arg2:String) = "test mix1"
    def test_mix2(arg1:Int,arg2:String,arg3:List[Any]) = "test mix2"
  }
val get_test = new TagCalculation
//test mix2
val test_mix2_para = Array(1, "aa",List(1,2))
val argtypes4 = test_mix2_para.map(_.getClass)
val method4 = get_test.getClass.getMethod("test_mix2", argtypes4: _*)

然后错误输出:

  

阶> val argtypes4 = test_mix2_para.map( .getClass)argtypes4:   Array [Class []] = Array(类java.lang.Integer,类   java.lang.String,类scala.collection.immutable。$ colon $ colon)

     

阶> val method4 = get_test.getClass.getMethod(“test_mix2”,   argtypes4:_ *)java.lang.NoSuchMethodException:   $ IWC万国表$$ $ TagCalculation.test_mix2(java.lang.Integer中,   java.lang.String,scala.collection.immutable。$ colon $ colon)at   java.lang.Class.getMethod(Class.java:1678)at   $ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC $$ iwC。(:26)at   $ $$ IWC IWC $$ IWC $$ IWC $$ IWC $$ IWC $$ IWC。(31)

有人可以给我一些帮助吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现它可以通过使用某些类型并告诉编译器你到底做了什么。在您的情况下,您可以使用java.lang.Integer而不是常规Int,另外还可以使用List类型。这个例子正在起作用:

class TagCalculation {
  def test(arg1: java.lang.Integer, arg2: String, arg3: scala.collection.immutable.$colon$colon[Any]) = "test mix2"
}

val getTest = new TagCalculation

val arg1: java.lang.Integer = 10
val arg2: String = "foobar"

// Just making a List[Any]
val arg3: scala.collection.immutable.$colon$colon[Any] = scala.collection.immutable.$colon$colon.apply('z', List("foo", 10))

val method = getTest.getClass.getMethod("test", arg1.getClass, arg2.getClass, arg3.getClass)
method.invoke(getTest, arg1, arg2, arg3)

不幸的是我不知道为什么会这样。

答案 1 :(得分:1)

你需要使用声明方法的类来调用getMethod,否则它不起作用:

get_test.getClass.getMethod("test_mix2", classOf[Int], classOf[String], classOf[List[Any]])

List的类型参数因类型擦除无关紧要)。如果您查看argtypes4,则不会包含这些类:将1放入Array并将对象框放到java.lang.Integer,然后List(1, 2)返回::(由$colon$colon转换为:,因为List不是JVM标识符中的合法字符),它是In [8]: df Out[8]: A B C 0 2 a a 1 3 s 3 2 4 c ! 3 1 f 1 的子类。