我正在编写一个 scala 应用程序,它在运行时加载 Groovy “插件”类。加载插件后,标准 scala 类型(如List
和Option
)将传递给它们进行处理。
Groovy 自然没有 scala 类型(尤其是Function*
家族)的语法糖,但我想要一个类似的简单语法。我现在最好的方法是使用as
运算符将常规闭包强制转换为 scala 类型,例如:
List<String> list = ... // Scala list
list.map({ it.toUpperCase() } as Function1<String,String>)
不必as ...
每次都包含尾巴会很好,因为它比实际的闭合要大。
这个问题建议将接收方法更改为不指定参数类型,但是只有当它是您可以控制的常规方法时才有效。我正在使用编译的 scala/java 类。
我知道有多种方法可以在 Groovy 中隐式转换内容,但是有许多独立加载的小型独立 groovy 脚本。我不太了解 groovy,无法理解哪种机制最适合这种架构,以便所有加载的插件都能以最少的仪式和导入获得这种隐式转换。我有大约 50 多个插件,所以简化这个 scala/groovy 互操作对我来说是值得的。
这是我如何加载 groovy 脚本的简化版本(Plugin
我的类型之一在哪里):
// Created once
val currentClassLoader = this.getClass.getClassLoader
val groovyClassLoader = new GroovyClassLoader(currentClassLoader)
...
// Many plugins created this way
val pluginFile = new java.io.File("path/to/some/plugin/MyPlugin.groovy")
val plugin: Plugin = groovyClassLoader.parseClass(pluginFile).asInstanceOf[Plugin]
// Use it
val list = List(1,2,3)
val answer = plugin.process(list)
提前致谢!
-罗汉