我可以使用一个从Java实现Java接口的scala类吗?
我正在学习Scala,很好奇是否有可能:
- 创建一个在Scala中实现Java接口的对象
- 将对象编译为类文件并 jar 它
- 使用 Java 中的对象
我想在scala中实现一个自定义的lucene查询解析器,并能够让其他人从Java应用程序访问它。
我正在学习Scala,很好奇是否有可能:
我想在scala中实现一个自定义的lucene查询解析器,并能够让其他人从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 源代码来满足任何依赖关系。第二个命令使用类路径上最近编译的 Scala 类调用 Java 编译器。
我已经在Scala 2.8中用Java 1.6.0和Solr 1.4.0实现了自定义和自定义。我不确定Solr 1.4.0使用的Lucene版本,但我假设一个相当新的版本。无论如何,我将Scala生成的类文件打包在一个jar中,Solr能够很好地加载它。所以你试图做的事情是可能的。org.apache.solr.handler.RequestHandlerBase
org.apache.solr.request.QueryResponseWriter
我想说的是,要克服的主要问题是从Java集合对象转换为Scala集合对象,反之亦然。 在Scala 2.8.0中,可能是你的朋友。List
Vector
scala.collection.JavaConversions
还有一件事,如果你需要覆盖像getBooleanQuery这样的方法,你可能需要添加来使Scala编译(代码未经测试 - 但是由于我在启动Scala时花了一段时间才弄清楚这种东西,我想我会分享):[_]
override def getBooleanQuery(clauses: java.util.List[_]): Query = { ... }
编辑::关于联合编译的另一件事。丹尼尔关于如何联合编译的信息是有用的。不过,您可能不会立即需要它,因为很可能,您只需要知道Lucene jar文件的路径,然后将您的类打包到一个新的jar中,并在部署的环境中在运行时使用您的jar文件。scalac