Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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