Я могу использовать scala класс, который реализует интерфейс Java от Java?

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

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

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

17
задан tommy chheng 27 February 2010 в 22:47
поделиться

3 ответа

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

28
ответ дан 30 November 2019 в 12:19
поделиться

Я реализовал пользовательский 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 использовался во время выполнения. в развернутой среде.

3
ответ дан 30 November 2019 в 12:19
поделиться

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

1
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: