Scala编译器直接编译为Java字节代码(或.NET CIL)。 Scala的一些功能可以直接在Java中重新完成(例如,简单的理解,类,翻译匿名/内部函数等)。那些无法翻译的功能是什么?
这可能主要是学术兴趣。或许更有用的是,您使用的Scala的主要特性或习惯用法是不是很容易用Java表示?
还有其他方法吗?可以在Java中直接完成的事情在Scala中没有直接的等价物? Java中没有翻译的成语?
答案 0 :(得分:11)
特质是没有等价物的一件事。特征是包含代码的接口。您可以将代码复制到所有混合了特征的类中,但这不是同一个东西。
另外我相信scala类型系统更完整。虽然它最终将映射到JVM类型(实际上遭受擦除)。您可以在Scala类型系统中表达Java中可能无法实现的一些内容(如差异)。
答案 1 :(得分:10)
在我看来,这个问题忽略了这一点,要求我们通过查看生成的字节码来比较JVM语言。
Scala编译为Java等效字节码。也就是说,字节码可能是由用Java编写的代码生成的。实际上,你甚至可以让scalac
输出一个看起来很像Java的中间形式。
所有功能,如 traits (通过静态转发器),非本地返回(通过异常),延迟值(通过引用)等都可以由Java程序表达,尽管可能最多 - 丑陋的方式!
但是什么使scala scala 而不是 Java 是scalac
可以为你做的,在生成字节码之前。 scalac
作为一种静态类型语言,它能够在编译时检查程序的正确性,包括类型正确性(根据其类型系统)。
Java和scala之间的主要区别(当然Java也是静态类型的)因此是scala的类型系统,它能够表达java-the-language的<编程关系< strong>类型系统无法。例如:
class Foo[M[_], A](m : M[A])
trait Bar[+A]
这些概念,M
是一个类型参数,它本身具有类型参数或Bar
是协变的,只是在Java-land中不存在。
答案 2 :(得分:4)
我认为,在某些特征中没有动态混合的等价物。在Scala中,您可以在创建新对象时添加一些混合的特征。
例如,我们创造了一只饥饿和口渴的狗和一只饥饿的狗。
val hungryThirstyDog = new Dog with Hungry with Thirsty
val onlyHungryDog = new Dog with Hungry
我不知道用Java做同样的方法。在Java中,继承是静态定义的。
答案 3 :(得分:4)
隐式转换在Java中没有直接的等价物。
答案 4 :(得分:4)
我发现很好用的scala的一个功能是通过清单进行类型设置。由于JVM从泛型中删除所有类型信息,因此scala允许您在变量中保存此信息。这是Java反射AFAIK无法处理的事情,因为字节码中的类型没有参数。
我需要它们的情况是在List
类型上进行模式匹配。这是,我有一个VertexBuffer
对象,它在GPU上存储数据,可以从浮点数或整数列表构建。 Manifest代码看起来大致如下:
class VertexBuffer[T](data:List[T])(implicit m:Manifest[T]) {
m.toString.match {
case "float" => ...
case "int" => ...
}
}
This link链接到包含更多信息的博文。
有很多SO页面也包含更多信息,例如this one。
答案 5 :(得分:3)
三个词:更高级的类型。
答案 6 :(得分:0)
您的主题不清楚您是指Java JVM还是Java语言。鉴于Scala在JVM上运行,q没有意义,因为我们都知道Scala在JVM上运行。
答案 7 :(得分:0)
Scala对XML有“本机”支持。您可以构建XML,查找元素,直接在Scala代码中匹配。