java.lang.NoSuchMethodException:scala.collection.immutable.$colon$colon

java.lang.NoSuchMethodException:scala.collection.immutable.$colon$colon,java,scala,intellij-idea,sbt,scala-reflect,Java,Scala,Intellij Idea,Sbt,Scala Reflect,我尝试使用变量作为字符串类型动态调用函数,即变量将包含函数名作为字符串。所以,我需要用这个变量调用一个函数 所以,我使用Scala反射。如果函数接受数据类型为Sting,则该函数可以工作,但抛出错误列表[Map[String,Double]] 我使用下面的链接来引用代码 下面是我正在测试的一个测试程序 package test import scala.collection.immutable.Map class DynamicaVariable { def cat(s1: List[M

我尝试使用变量作为字符串类型动态调用函数,即变量将包含函数名作为字符串。所以,我需要用这个变量调用一个函数

所以,我使用Scala反射。如果函数接受数据类型为Sting,则该函数可以工作,但抛出错误列表[Map[String,Double]]

我使用下面的链接来引用代码

下面是我正在测试的一个测试程序

package test

import scala.collection.immutable.Map

class DynamicaVariable {
 def cat(s1: List[Map[String, Double]]) = {
  println(s1)
 }
}

object DynamicaVariable{
 def main(args: Array[String]): Unit = {

 val obj = new DynamicaVariable
 val data = List(
  Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0), Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0), Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
)
 val functionName = "cat"
 val method = obj.getClass.getMethod(functionName,data.getClass)
 method.invoke(obj,data)
}
}
我的scala版本是2.11.6,我正在使用IntelliJ。我也检查了SDK版本。并取消选中scala下的“在编译过程中运行工作表”

但还是没有运气!任何想法都会有帮助。谢谢

如本文所述

在Scala类上使用Java反射可能会返回令人惊讶或不正确的结果

对于您的情况,由于数据的类型是scala.collection.immutable.List,您需要在运行时使用scala反射来获取数据val的类型。这里有一个例子

import scala.reflect.ClassTag
import scala.reflect.classTag

class DynamicaVariable {
    def cat(s1: List[Map[String, Double]]) = {
        println(s1)
    }
}

object DynamicaVariable{
    def main(args: Array[String]): Unit = {
        val obj = new DynamicaVariable
        val data = List(Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0)
                        , Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0)
                        , Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0)
                        , Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0))
        val functionName = "cat"
        val method = obj.getClass.getMethod(functionName, getClassOf(data).runtimeClass)

        method.invoke(obj,data)
    }

    def getClassOf[T: ClassTag](obj: T) = classTag[T]
}

我在下面给出了一个可行的解决方案,该解决方案使用scala反射,而不是@ValentInu的java/scala混合

我不是反射大师,所以我不知道下面的内容是否是惯用的

import scala.collection.immutable.Map
import scala.reflect.runtime.{universe => ru}

class DynamicaVariable {
  def cat(s1: List[Map[String, Double]]) = {
    println(s1)
  }
}

object DynamicaVariable {
  def main(args: Array[String]): Unit = {

    val obj = new DynamicaVariable
    val data = List(
      Map("a" -> 1.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
      Map("a" -> 1.0, "b" -> 2678.0, "c" -> 40.0, "d" -> 2.0),
      Map("a" -> 4.0, "b" -> 267.0, "c" -> 26.0, "d" -> 2.0),
      Map("a" -> 1.0, "b" -> 2678.0, "c" -> 90.0, "d" -> 17.0)
    )
    val functionName = "cat"
    val mirror = ru.runtimeMirror(getClass.getClassLoader)
    val instanceMirror: ru.InstanceMirror = mirror.reflect(obj)
    val classSymbol = mirror.classSymbol(obj.getClass)
    val termName: ru.MethodSymbol = classSymbol.info.decl(ru.TermName(functionName)).asMethod


    val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(termName)
    methodMirror.apply(data)
  }
}

不确定是否有帮助,但通过这种方式调用getMethod
val method=obj.getClass.getMethod(functionName,classOf[List[Map[String,Double]])
对meI有效:和