我们可以在Java程序中编写Scala代码吗?
对于这个基本问题,我已经有了一个用Java编写的大型软件(我正在使用Eclipse Mars进行编辑),我想更改其中的一些类,并使用Scala而不是Java,这是可能的吗?就在: 无缝JAVA互操作—Scala在JVM上运行,因此JAVA和Scala堆栈可以自由混合,实现完全无缝的集成 如果您单击它,它将为您提供进一步的信息: 将Scala和Java无缝结合 Scala类最终是JVM类。您可以创建Java对象,调用它们的方法,并从Scala透明地继承Java类。类似地,Java代码可以引用Scala类和对象 在本例中,Scala类作者实现了Java接口Comparable并处理Java文件。Java代码使用来自同伴对象Author的方法,并访问Author类的字段。它还使用JavaConversion在Scala集合和Java集合之间进行转换 在这个例子中:我们可以在Java程序中编写Scala代码吗?,java,eclipse,scala,Java,Eclipse,Scala,对于这个基本问题,我已经有了一个用Java编写的大型软件(我正在使用Eclipse Mars进行编辑),我想更改其中的一些类,并使用Scala而不是Java,这是可能的吗?就在: 无缝JAVA互操作—Scala在JVM上运行,因此JAVA和Scala堆栈可以自由混合,实现完全无缝的集成 如果您单击它,它将为您提供进一步的信息: 将Scala和Java无缝结合 Scala类最终是JVM类。您可以创建Java对象,调用它们的方法,并从Scala透明地继承Java类。类似地,Java代码可以引用Sca
Author.scala
:
class Author(val firstName: String,
val lastName: String) extends Comparable[Author] {
override def compareTo(that: Author) = {
val lastNameComp = this.lastName compareTo that.lastName
if (lastNameComp != 0) lastNameComp
else this.firstName compareTo that.firstName
}
}
object Author {
def loadAuthorsFromFile(file: java.io.File): List[Author] = ???
}
App.java
:
import static scala.collection.JavaConversions.asJavaCollection;
public class App {
public List<Author> loadAuthorsFromFile(File file) {
return new ArrayList<Author>(asJavaCollection(
Author.loadAuthorsFromFile(file)));
}
public void sortAuthors(List<Author> authors) {
Collections.sort(authors);
}
public void displaySortedAuthors(File file) {
List<Author> authors = loadAuthorsFromFile(file);
sortAuthors(authors);
for (Author author : authors) {
System.out.println(
author.lastName() + ", " + author.firstName());
}
}
}
导入静态scala.collection.JavaConversions.asJavaCollection;
公共类应用程序{
公共列表loadAuthorsFromFile(文件文件){
返回新的ArrayList(asJavaCollection(
Author.loadAuthorsFromFile(文件));
}
公共无效排序器(列出作者){
集合。排序(作者);
}
公共无效显示排序器(文件){
列表作者=loadAuthorsFromFile(文件);
巫师(作者);
for(作者:作者){
System.out.println(
author.lastName()+,“+author.firstName());
}
}
}
您的示例可能是另一种方式,在Scala应用程序中使用Java类,但因为最终它只是JVM类(上面的示例在Scala代码中使用Java类,如
Java.io.File
),所以也是一样的。在src
中添加一个子文件夹,名为Scala
,并将代码放在那里。您必须在Scala中完全重写该类。
之后,将Scala编译插件添加到mvn.pom
或向谷歌咨询您的构建系统
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<charset>${project.build.sourceEncoding}</charset>
<recompileMode>modified-only</recompileMode>
<scalaCompatVersion>2.11</scalaCompatVersion>
<scalaVersion>2.11.5</scalaVersion>
<jvmArgs>
<jvmArg>-Xmx1024m</jvmArg>
<jvmArg>-DpackageLinkDefs=file://${project.build.directory}/packageLinkDefs.properties</jvmArg>
</jvmArgs>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
net.alchim31.maven
scala maven插件
3.2.0
${project.build.sourceEncoding}
仅修改
2.11
2.11.5
-Xmx1024m
-DpackageLinkDefs=file://${project.build.directory}/packageLinkDefs.properties
编译
测试编译
如果Scala已经用Java编写,为什么要改为Scala?有什么具体的原因吗?是的,这是完全可能的,事实上我以前也这么做过。您需要Scala编译器,该编译器将从您的Scala代码中生成Java.class
。谢谢@kocko,非常感谢您的任何参考或示例:)好吧……可能是一个很好的起点。