Я пишу приложение scala, которое загружает классы Groovy «plugin» во время выполнения. После загрузки плагинов в них передаются стандартные типы scala (например, List
и Option
).Неявно преобразовать тип groovy для перехода к фиксированному методу без groovy
У Groovy, естественно, нет синтаксического сахара для типов scala (в частности, семейства Function*
), но мне бы хотелось получить простой простой синтаксис. Лучшее, что я есть сейчас, чтобы использовать оператор as
принуждать заводной замыкания на типы SCALA, например:
List<String> list = ... // Scala list
list.map({ it.toUpperCase() } as Function1<String,String>)
Было бы хорошо, чтобы не должны включать в себя as ...
хвост каждый раз, как это больше, чем фактическое закрытие ,
This вопрос предлагает изменить метод приема, чтобы не указывать тип параметра, однако это работает только тогда, когда вы можете управлять методом groovy. Я использую скомпилированные классы scala/java.
Я знаю, что существуют различные способы неявного преобразования вещей в Groovy, однако есть много небольших изолированных groovy-скриптов, загружаемых независимо. Я недостаточно разбираюсь в хорошем понимании того, какой механизм лучше всего подходит для этой архитектуры, так что все загруженные плагины получают это неявное преобразование с минимальной церемонией и импортом. У меня около 50 + плагинов, поэтому оптимизация этого scala/groovy interop мне того стоит.
Это упрощенная версия как я загрузки заводной скрипты (где 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
Вы пробовали код без 'as Function1'? Функция1 не является функциональным интерфейсом в смысле Java, так как это не интерфейс, но он выглядит мне по-прежнему как тип SAM, который позволяет вам автоматически конвертировать, даже если это не интерфейс. Поэтому, не имея опыта работы с scala и scala.Function1, я думаю, что это может просто работать без явного преобразования. –
blackdrag
@blackdrag Спасибо за информацию - он терпит неудачу без 'as ...'. Что-то вроде 'lines.map ({it.toUpperCase()})' бросает 'MissingMethodException':« Нет сигнатуры метода: scala.collection.mutable.ArrayBuffer.map() применим для типов аргументов: ... » – rmin
какую версию вы используете? – blackdrag