Я изучаю Scala и был любопытен, если будет возможно:
Я хочу реализовать пользовательский lucene анализатор запроса в scala и быть в состоянии позволить другим получить доступ к нему из JAVA-приложения.
Я предполагаю, что под «объектом» вы на самом деле имеете в виду «класс». В любом случае ответ - да, вы можете это сделать. Вам нужно будет воспользоваться преимуществами совместного компилятора Scala / Java, если вы хотите, чтобы все это было в одном проекте. Например:
public interface Parser {
public TokenIterator parse(InputStream is);
}
Затем в Scala:
class ParserImpl extends Parser {
def parse(is: InputStream) = ...
}
Наконец, снова в Java:
public class Consumer {
public static void main(String[] args) {
Parser p = new ParserImpl(); // just like a Java class!
...
}
}
Если все эти исходные файлы находятся в одном проекте, вы захотите скомпилировать их, используя следующие команды:
$ scalac *.scala *.java
$ javac -classpath . *.java
Первая команда вызывает совместный компилятор Scala / Java, который скомпилирует исходные коды Scala и достаточное количество исходных текстов Java для удовлетворения любых зависимостей. Вторая команда вызывает компилятор Java с недавно скомпилированными классами Scala в пути к классам.
Я реализовал пользовательский org.apache.solr.handler.RequestHandlerBase
и пользовательский org.apache.solr.request .QueryResponseWriter
в Scala 2.8 с Java 1.6.0 и Solr 1.4.0. Я не уверен, что версия Lucene, которую использует Solr 1.4.0, но предполагаю, что это довольно новая версия. В любом случае, я упаковал файлы классов, сгенерированные Scala, в банку, и Solr смог нормально их загрузить. Итак, то, что вы пытаетесь сделать, возможно.
Я бы сказал, что главное, что нужно преодолеть, - это преобразовать объекты коллекции Java, такие как List
и Vector
, в объекты коллекции Scala и наоборот. scala.collection.JavaConversions
в Scala 2.8.0, вероятно, будет вашим другом.
Еще одна вещь: если вам нужно переопределить такой метод, как getBooleanQuery , вам может потребоваться добавить [_]
, чтобы скомпилировать Scala (код не тестировался, но поскольку для этого потребовалось Когда я начал Scala, я подумал, что поделюсь):
override def getBooleanQuery(clauses: java.util.List[_]): Query = { ... }
Edit: : Еще кое-что о совместной компиляции. Информация Даниэля о том, как совместная компиляция, полезна. Возможно, он вам не понадобится сразу, так как, скорее всего, вам просто нужно, чтобы scalac
знал путь к файлам jar Lucene, затем упаковал ваш класс в новый jar, и ваш файл jar использовался во время выполнения. в развернутой среде.
Да, это возможно. Некоторые из функций Scala (например, одноэлементные объекты) компилируются в код, который трудно использовать из Java, но использование классов Scala через интерфейс Java - простой способ написать совместимый код.
Ответы на некоторые вопросы о совместимости с Java можно найти на http://www.scala-lang.org/faq/4 и в книге Программирование на Scala . Цитата из этого FAQ:
Могу ли я использовать существующий код Java из Scala?
Доступ к классам Java из кода Scala вообще не проблема. Использование класса Scala из Java может вызвать затруднения, в частности, если ваш класс Scala использует расширенные функции, такие как универсальные методы, полиморфные методы или абстрактные типы. Поскольку в Java нет таких языковых функций, вы должны кое-что знать о схеме кодирования классов Scala. В остальном проблем быть не должно.
Нужно ли мне преобразовывать структуры данных Java в Scala и наоборот?
Вам вообще не нужно преобразовывать структуры данных Java, чтобы использовать их в Scala. Вы можете использовать их «как есть».Например, классы Scala могут создавать подклассы классов Java, вы можете создавать экземпляры классов Java в Scala, вы можете обращаться к методам, полям (даже если они статические) и т. Д.