【问题标题】:Scala: how to fix java.lang.NoSuchMethodException when invoking fun with mix(Int,string,list)Scala:使用 mix(Int,string,list) 调用 fun 时如何修复 java.lang.NoSuchMethodException
【发布时间】:2017-06-01 00:56:01
【问题描述】:

让我写代码吧:)

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

然后错误输出:

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

scala> val method4 = get_test.getClass.getMethod("test_mix2", argtypes4: _*) java.lang.NoSuchMethodException: $iwC$$iwC$TagCalculation.test_mix2(java.lang.Integer, java.lang.String, scala.collection.immutable.$colon$colon) 在 java.lang.Class.getMethod(Class.java:1678) 在 $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.(:26) 在 $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.(:31)

有人可以帮我吗?

【问题讨论】:

    标签: scala


    【解决方案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)
    

    很遗憾,我不知道为什么会这样。

    【讨论】:

    • 效果很好!你是百万分之一
    • 不涉及隐式转换。
    【解决方案2】:

    您需要使用声明该方法的确切类调用getMethod,否则它不起作用:

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

    List 的类型参数无关紧要,因为类型擦除)。如果您查看argtypes4,它不包含这些类:将1 放入Array 与对象一起将其框到java.lang.Integer,并且List(1, 2) 返回一个::(转换为@987654330 @ 因为: 不是 JVM 标识符中的合法字符),它是 List 的子类。

    【讨论】:

    • 嗨,如果 val method4 = get_test.getClass.getMethod("test_mix2", classOf[Int], classOf[字符串],类[列表[任何]])。它将是“:39: error: type mismatch; found : Array[Any] required: Array[_ <: object>
    • 已回答您的其他问题。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2018-06-29
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多