2015-05-15 7 views
0

Я пишу приложение 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

+0

Вы пробовали код без 'as Function1 '? Функция1 не является функциональным интерфейсом в смысле Java, так как это не интерфейс, но он выглядит мне по-прежнему как тип SAM, который позволяет вам автоматически конвертировать, даже если это не интерфейс. Поэтому, не имея опыта работы с scala и scala.Function1, я думаю, что это может просто работать без явного преобразования. – blackdrag

+0

@blackdrag Спасибо за информацию - он терпит неудачу без 'as ...'. Что-то вроде 'lines.map ({it.toUpperCase()})' бросает 'MissingMethodException':« Нет сигнатуры метода: scala.collection.mutable.ArrayBuffer.map() применим для типов аргументов: ... » – rmin

+0

какую версию вы используете? – blackdrag

ответ

0

Я проверил байт-код из FUNCTION1 Скале производит и представляет собой интерфейс, но далеко не один с одним абстрактным методом. Это означает, что это бесполезно для преобразования SAM, т.е. Java 8 не сможет использовать lambdas для автоматического преобразования в это. Я также проверил AbstractFunction1, и хотя это абстрактный класс, он не имеет абстрактного метода, поэтому даже это бесполезно для расширенного преобразования SAM, как это делает Groovy.

Единственное решение, которое я вижу, это написать extension module, который выполняет преобразование.

EDIT: Возможно, scala-java8-compat может помочь. Он нацелен на использование java8 lambdas для scala FunctionN, что также позволило бы преобразование SAM для открытых блоков в случае Groovy 2.2.0 +

+0

Спасибо за вашу помощь и ресурсы - проследим за ними. Я знал о модулях расширения и других средствах метапрограммирования. Я надеялся получить совет относительно того, какой режим лучше всего подходит для моей архитектуры стиля плагина.Из того, что вы говорите, похоже, что модули расширения являются * единственным способом сделать это, верно? – rmin

+0

Конечно, вы можете добавлять методы другими способами, такими как мета-программирование во время выполнения, но в этой ситуации мне представляется более практичным применение модулей расширения. Например, вам не придется платить штраф за использование ExpandoMetaClass. – blackdrag

 Смежные вопросы

  • Нет связанных вопросов^_^