Scala的哪些功能无法转换为Java?

The*_*aul 9 java scala idioms

Scala编译器直接编译为Java字节代码(或.NET CIL).Scala的一些功能可以直接用Java重新完成(例如,简单的理解,类,翻译匿名/内部函数等).那些无法翻译的功能有哪些?

这可能大部分都是学术兴趣.更有用的是,或许,您使用的Scala的主要特性或习惯用法无法在Java中轻松表示?

还有其他方法吗?可以在Java中直接完成的事情在Scala中没有直接的等价物?Java中没有翻译的习语?

Tho*_*mas 11

特质是没有等价物的一件事.特征是包含代码的接口.您可以将代码复制到所有混合了特征的类中,但这不是同一个东西.

另外我相信scala类型系统更完整.虽然它最终将映射到JVM类型(实际上遭受擦除).您可以在Scala类型系统中表达Java中可能无法实现的一些内容(如差异).


oxb*_*kes 10

在我看来,这个问题忽略了这一点,要求我们通过查看生成的字节码来比较JVM语言.

Scala编译为Java等效字节码.也就是说,字节码可能是由用Java编写的代码生成的.实际上,你甚至可以scalac输出一个看起来很像Java的中间形式.

所有功能,如特征(通过静态转发器),非本地返回(通过异常),延迟值(通过引用)等都可以由Java程序表达,尽管可能以最丑陋的方式!

但是在生成字节码之前,是什么让scala scala而不是Javascalac能为你做什么.什么已经为它去,作为一个静态类型语言,是检查程序的正确性,包括类型的正确性(根据其能力类型系统在编译时).scalac

因此,Java和scala之间的主要区别(当然Java也是静态类型的)是scala的类型系统,它能够表达java-the-language的类型系统无法实现的编程关系.例如:

class Foo[M[_], A](m : M[A])
trait Bar[+A]
Run Code Online (Sandbox Code Playgroud)

这些概念,即M一个本身具有类型参数或Bar协变的类型参数,在Java-land中不存在.