Могу ли я использовать класс Scala, который реализует интерфейс Java из Java? - PullRequest
17 голосов
/ 28 февраля 2010

Я изучаю Scala и мне было любопытно, можно ли будет:

  1. Создание объекта, который реализует интерфейс Java в Scala
  2. Скомпилируйте объект в файл класса и сделайте jar
  3. Использовать объект из Java

Я хочу реализовать собственный анализатор запросов lucene в scala и иметь возможность разрешать другим доступ к нему из Java-приложения.

Ответы [ 3 ]

28 голосов
/ 28 февраля 2010

Я предполагаю, что под «объектом» вы на самом деле имеете в виду «класс». В любом случае, ответ - да, вы можете сделать это. Вам нужно будет воспользоваться совместным компилятором 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 на пути к классам.

3 голосов
/ 28 февраля 2010

Я реализовал пользовательский 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 = { ... }

Редактировать: : Еще одна вещь о совместной компиляции. Информация Даниила о том, как объединить компиляцию, полезна. Он может вам и не понадобиться, хотя, скорее всего, вам просто нужно scalac знать путь к jar-файлам Lucene, затем упаковать свой класс в новый jar и использовать ваш jar-файл во время выполнения в развернутой среде ,

1 голос
/ 28 февраля 2010

Да, это возможно. Некоторые функции 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, вы можете обращаться к методам, полям (даже если они статические) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...