首页 文章

隐式转换groovy类型以传递给固定的非groovy方法

提问于
浏览
0

我正在编写一个scala应用程序,它在运行时加载Groovy "plugin"类 . 加载插件后,会将标准的scala类型(如 ListOption )传递给它们进行处理 .

Groovy自然没有scala类型的语法糖(特别是 Function* 系列),但我想要一个类似的简单语法 . 我现在最好的是使用 as 运算符将groovy闭包强制转换为scala类型,例如:

List<String> list = ... // Scala list
list.map({ it.toUpperCase() } as Function1<String,String>)

不必每次都包含 as ... 尾部,因为它比实际闭合更大,这将是很好的 .

This问题建议将接收方法更改为不指定参数类型,但只有在使用已编译的scala / java类时才能使用.2712403_m .

我知道有很多方法可以隐式转换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)

提前致谢!

-Rohan

1 回答

  • 0

    我检查了Function1 scala产生的字节码,它是一个接口,但到目前为止还没有一个抽象方法 . 这意味着它对SAM转换毫无用处,即 . Java 8将无法使用lambdas进行自动转换 . 我还检查了AbstractFunction1,虽然它是一个抽象类,但它没有抽象方法,因此即使对Groovy这样做也没有用于扩展SAM转换 .

    我看到的唯一解决方案是编写一个进行转换的extension module .

    编辑:也许scala-java8-compat可以提供帮助 . 它的目标是允许java8 lambdas用于scala FunctionN,这也允许在Groovy 2.2.0的情况下为开放块进行SAM转换

相关问题