自动将Java转换为Scala源代码?

44

(是的,我知道Scala可以调用Java代码;但这是无意义的;我想删除Java代码,而不是让它保留并且必须一直查看和维护它!)

是否有任何实用程序可以将Java源代码转换为Scala源代码?

我相信在最小的损失情况下应该是可能的。

我找到了这个,但它似乎已经停止更新,可能存在错误或不完整... http://sourceforge.net/projects/java2scala/

有其他替代方案吗?


6
即使自动转换存在,我仍会对它持谨慎态度。Scala的最大优势之一是能够以更紧凑和易于理解的方式表达编码问题。自动转换将用Scala语法表达一个Java风格的解决方案。 - Rex Kerr
@Rex Kerr - 加一,你应该把你的评论变成一个答案。Scala习惯用语与Java截然不同,即使是写得很好的Java代码也会变成写得很差的Scala代码。 - kdgregory
@Alex R - 我不知道你有多少Java代码,但如果只有几千个类,最好手动转换。你应该能够分阶段进行,一次替换一组类。在这个过程中,你几乎肯定会学到关于Java和Scala的一些东西。 - kdgregory
你先自动转换代码,然后再进行手动重构的情况怎么样?看起来比完全手动转换更安全(也更快)。 - Erik Kaplun
IntelliJ 像个行家一样工作。 - Vishrant
6个回答

39

IntelliJ有点像这样,您需要打开一个包含Java源代码的项目。然后可以将表达式、方法或整个类复制/粘贴到.scala文件中。这将转换为等效的Scala代码。

转换的准确性并不完美,因此目前不支持批量转换。

我建议使用最新版本的IntelliJScala插件。社区版是免费的。

此外,Paul Phillips曾经启动了Scalify项目,将代码从Java翻译成Scala(或者可能是您喜欢的语言),并在此过程中改进代码!他在这段视频中解释了这个概念。但是这个项目已经停滞不前,可能是因为他将注意力转向直接为Scala编译器和标准库做出贡献。


10
太好了。我很快会尝试使用IntelliJ。我简直不敢相信还有人认为像将尖括号换成方括号,把类型声明移动到“:”的另一侧这样的琐碎事情也应该手动完成!他们一定不是认真的人 :-) - Alex R
2
太棒了。非常高兴有这个IntelliJ功能。 - laher
2
这是Paul Phillips的Scalify项目的可用分支(似乎不再维护):https://github.com/mbana/scalify。此外,还有http://javatoscala.com。 - Roland Ewald

27
在IntelliJ IDEA中有一个名为“Convert to Scala”的重构功能。它位于“Refactor”菜单下(在安装Scala插件后),快捷键是Ctrl+Shift+G。 因此,您无需进行复制/粘贴操作。 只需确保您打开的是Java文件,如果是Scala或其他文件,则没有此选项。

1
选择任何Java类或在编辑器中打开它,此菜单项应该出现(已在IDEA 10.5.1中测试)。 - Eugene Platonov
我在使用11.1社区版和Scala插件0.5.808时也没有看到这个选项。 - devth
2
在此选项出现之前,您需要确保您的项目支持Scala。右键单击您的项目,然后选择添加框架支持...并添加Scala。 - Jonathan Hult
在最新的Scala插件15+中,我在重构上下文菜单中没有找到它 - 只在重构主菜单(底部)中找到了。 - ycomp
我有社区版15.0.4 EAP(143.2167.2)和Scala插件2.2.5。我仍然可以在主重构菜单和上下文菜单的重构子菜单中看到“转换为Scala”选项。 - Eugene Platonov
显示剩余2条评论

16

我刚刚发布了以下工具:Scalagen。我也尝试过Jatran,但是由于一些错误和难以集成的问题而感到沮丧。 Scalagen 是可扩展的,并带有一个Maven插件。


1
看起来很不错,但是有没有办法在没有使用Maven的项目上运行它? - James McMahon
你当然可以直接运行Scala代码,Maven插件只是一个薄的包装器。 - Timo Westkämper
看了你的 mojo 类,你使用了 Converter.instance().convert(in, out);。我在你的代码中没有看到主要的支架。你直接运行 Scala 代码是指编写一些特定的代码来转换我的项目,还是有内置的方法来实现这个? - James McMahon
没有内置的方法,但如果你愿意,可以贡献一些东西。 - Timo Westkämper
已完成,https://github.com/mysema/scalagen/pull/36。请记住,我只是匆忙地把它放在一起,只是为了玩弄scalagen。 - James McMahon

9

6

我刚才点击了链接,但这个项目是空的,没有文件、维基页面或活动 :-( - Hugh Perkins
@Hugh:以下方法适用于我:1)检出代码(http://code.google.com/p/jatran/source/checkout),2)使用ant,3)运行./jatran.sh --input SomeClass.java。 - Matt R

2

我认为在一般情况下不可能自动将Java转换为Scala。Java中的许多低级结构在Scala中不存在(例如字段和静态成员),Scala对构造函数施加了Java所没有的限制,并且Scala没有像Java那样的原始类型(没有指定泛型参数的泛型)。


2
字段和静态成员确实存在。如果遇到静态字段等,您可以轻松创建对象。对于未指定参数的泛型,在Scala中始终可以使用Any。将Java转换为Scala绝对是可能的(如果不是微不足道的)。特别是因为两种语言都在JVM上运行,所以您完全没有功能方面的问题,因为您甚至可以调用Java标准库。而且两种语言都是静态类型的。总之,如果您想将语言A转换为B,则选择将Java转换为Scala是最容易的情况之一。 - Joa Ebert
4
有“逻辑等价物”,但它们根本不一样,因此翻译最终变得近似。天真的翻译可能适用于简单的例子,但对于复杂的代码则会出现错误。 - Erik Engbrecht
似乎反过来(Scala 到 Java)是不可能的。https://dev59.com/k2kw5IYBdhLWcg3wdKQv - Jus12
Scala没有像Java那样的原始类型(没有指定泛型参数的泛型),那[_]参数呢? - Display Name
静态成员和原始类型在Scala中可以轻松映射;我不明白字段在Scala中不存在的意思,或者你是指它们总是自动包装为setter-getter对吗?但这也是一个简单的1-1映射。 - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接