【问题标题】:Java's Method.isVarArgs() doesn't work with method in scalaJava Method.VarArgs() 不适用于 scala 中的方法
【发布时间】:2016-03-07 20:56:34
【问题描述】:

我是 scala 的新手。有我无法解决的问题。我使用java反射来检查用scala编写的方法。(我在scala中找不到正确的方法) 像这样的代码:

case class SomeClass(udf: UDF) {
    // Get Method object of "eval" method in udf
    val evalMethod: Method = {
        var evalMethods: ListBuffer[Method] = new ListBuffer[Method]
        udf.getClass.getMethods.foreach(m => {
            if (m.getName().equals("eval")) {
                evalMethods += m
            }
        })
        if (evalMethods.length != 1) {
            throw new Exception(s"$udf must have only one eval method")
        }
        evalMethods(0)
    }

    val evalParamsType = {
        val hasVarArgs = evalMethod.isVarArgs // Not work here
        println("varargs:" + hasVarArgs) // Always false
        for (param <- evalMethod.getParameterTypes) {
            // do some thing
        }
        // return some thing
    }
}

trait UDF {
}

object SomeUDF extends UDF {
    def eval(fields: String*) = {
        // do something here
    }
}

代码可能看起来很奇怪,我必须使用反射来完成这项工作,因为 UDF 中的“eval”方法可以有不同的参数和返回类型。 (这是另一个问题……)

似乎java中的Method类无法识别scala中的可变参数,有没有办法在java或scala中完成这项工作?

【问题讨论】:

  • 您不需要先将 hasVarArgs 分配给 val 或 var 吗?
  • 哦,你是对的,这是错误的编辑,我会修复它。问题不是这个,不过还是谢谢
  • 这整件事看起来很可疑。为什么要这样做?问你这个问题。答案将是“因为我想做 bla bla bla”谷歌“如何在 scala 中解决 bla bla bla”如果你没有找到它,请在 StackOverflow 上询问。

标签: scala


【解决方案1】:

Scala 的可变参数编码方案与 java 不同。

// used :javap SomeUDF in scala repl
public void eval(scala.collection.Seq<java.lang.String>);

Scala 使用scala.collection.Seq。 Java 使用Array。 您可以使用@scala.annotation.varargs 告诉编译器生成一个java varargs 桥接方法(将调用scala 变体)。

object SomeUDF extends UDF {
    @scala.annotation.varargs
    def eval(fields: String*) = {
        // do something here
    }
}

scala repl javap 输出现在包含一个 java varargs 方法。

public void eval(java.lang.String...)

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 2017-04-04
    • 1970-01-01
    • 2021-09-16
    • 2017-02-13
    • 2018-07-19
    • 2015-12-20
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多