这可能主要是学术上的兴趣。更有用的是,您使用的Scala的关键功能或习惯用法在Java中无法轻松表示?
反过来呢?有没有在Java中可以直接完成但在Scala中没有直接等效的事情?在Java中不可转换的习语?
特质是一种没有相应的等价物。特质是带有代码的接口。您可以将代码复制到所有混入特质的类中,但那并不是同一件事情。
此外,我认为Scala类型系统更加完整。虽然它最终会映射到JVM类型(实际上受到擦除的影响)。您可以在Scala类型系统中表达一些在Java中不可能的东西(例如变量)。
在我看来,这个问题没有理解到重点,因为它让我们通过比较生成的字节码来比较JVM语言。
Scala编译成等效于Java的字节码。也就是说,该字节码可以由用Java编写的代码生成。实际上,您甚至可以让scalac
输出一个中间形式,看起来很像Java。
所有功能,例如特质(通过静态前导器)、非本地返回(通过异常)、惰性值(通过引用)等,都可以通过Java程序表达,尽管这可能以最丑陋的方式!
但是使Scala成为Scala而不是Java的原因,在于scalac
能够在生成字节码之前为您完成的工作。作为一种静态类型语言,scalac
具有检查程序正确性的能力,包括在编译时根据其类型系统进行类型正确性检查。
因此,Java和Scala之间的主要区别(当然,Java也是静态类型的)在于Scala的类型系统,它能够表达Java语言的类型系统不能表达的编程关系。例如:
class Foo[M[_], A](m : M[A])
trait Bar[+A]
在Java的世界里,这些概念,比如M是一个具有自身类型参数的类型参数或者Bar是协变的,就不存在。
我认为,在动态混入一些特质方面没有与之相等的。在Scala中,您可以在创建新对象的同时添加某些特质,将其混入。
例如,我们创建了一个又饥饿又口渴的狗和一个只是饥饿的狗。
val hungryThirstyDog = new Dog with Hungry with Thirsty
val onlyHungryDog = new Dog with Hungry
我不知道Java中是否有相应的方法来实现这个。在Java中,继承是静态定义的。
在Java中,隐式转换没有直接的等价物。
List
类型进行模式匹配。也就是说,我有一个VertexBuffer
对象,它存储在GPU上的数据,并且可以从浮点数或整数列表构建。Manifest代码大致如下:class VertexBuffer[T](data:List[T])(implicit m:Manifest[T]) {
m.toString.match {
case "float" => ...
case "int" => ...
}
}
这个链接指向一个博客文章,提供更多信息。
也有很多关于此主题的SO页面,例如这个。
Class<T>
。 - Aaron Novstrup您的主题不清楚,无论是指JVM还是Java语言。鉴于Scala运行在JVM上,这个问题毫无意义,因为我们都知道Scala运行在JVM上。