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

时间:2010-11-29 14:00:07

标签: java scala idioms

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

这可能主要是学术兴趣。或许更有用的是,您使用的Scala的主要特性或习惯用法是不是很容易用Java表示?

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

8 个答案:

答案 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代码中匹配。

示例:http://programming-scala.labs.oreilly.com/ch10.html