Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala的哪些功能不能转换为Java?_Java_Scala_Idioms - Fatal编程技术网

Scala的哪些功能不能转换为Java?

Scala的哪些功能不能转换为Java?,java,scala,idioms,Java,Scala,Idioms,Scala编译器直接编译为Java字节码(或.NET CIL)。Scala的一些特性可以直接在Java中重新实现(例如,对于理解、类、翻译匿名/内部函数C等来说很简单)。哪些功能不能以这种方式翻译 这大概主要是出于学术兴趣。更有用的是,您使用的Scala的哪些关键特性或习惯用法不能用Java轻松表示 还有别的办法吗?在Java中可以直接完成但在Scala中没有直接等价物的事情?Java中不翻译的习语?Traits是一个没有等价物的东西。特征是包含代码的接口。您可以将代码复制到所有混合了特性的类,

Scala编译器直接编译为Java字节码(或.NET CIL)。Scala的一些特性可以直接在Java中重新实现(例如,对于理解、类、翻译匿名/内部函数C等来说很简单)。哪些功能不能以这种方式翻译

这大概主要是出于学术兴趣。更有用的是,您使用的Scala的哪些关键特性或习惯用法不能用Java轻松表示


还有别的办法吗?在Java中可以直接完成但在Scala中没有直接等价物的事情?Java中不翻译的习语?

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


而且我相信scala类型的系统更完整。虽然它最终会映射到JVM类型(实际上会被擦除)。您可以在Scala类型系统中表达Java中可能无法表达的某些东西(如差异)。

我认为,动态混合某些特性是没有等价物的。在Scala中,您可以在创建新对象时添加一些混合的特性

例如,我们创建了一只饥渴的狗和一只饥饿的狗

val hungryThirstyDog = new Dog with Hungry with Thirsty
val onlyHungryDog = new Dog with Hungry

我不知道用Java做这件事的等效方法。在Java中,继承是静态定义的。

隐式转换在Java中没有直接的等价物。

在我看来,这个问题没有抓住要点,要求我们通过查看JVM语言生成的字节码来比较它们

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

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

但是,在字节码生成之前,
scalac
可以为您做什么,才是scala-scala而不是Java的关键所在。作为一种静态类型语言,
scalac
的作用是在编译时检查程序的正确性,包括类型正确性(根据其类型系统

因此,Java和scala之间的主要区别(当然Java也是静态类型的)是scala的类型系统,它能够表达Java语言的类型系统无法表达的编程关系。例如:

class Foo[M[_], A](m : M[A])
trait Bar[+A]

这些概念,
M
是一个本身具有类型参数的类型参数,或者
Bar
是协变的,但在Java世界中并不存在。

我发现scala的一个很好的用途是通过实现类型具体化。由于JVM从泛型中去掉了所有类型信息,scala允许您将这些信息保存在变量中。这是Java反射AFAIK无法处理的,因为字节码中没有类型的参数

我需要它们的情况是在
列表的类型上进行模式匹配。也就是说,我有一个
VertexBuffer
对象,它将数据存储在GPU上,可以从浮点或整数列表中构造。清单代码大致如下所示:

class VertexBuffer[T](data:List[T])(implicit m:Manifest[T]) {
  m.toString.match {
    case "float" => ...
    case "int" => ...
  }
}
链接到包含更多信息的博客文章


还有很多SO页面包含更多信息,比如。

三个词:高级类型。

您的主题不清楚您是指Java JVM还是Java语言。鉴于Scala在JVM上运行,q毫无意义,因为我们都知道Scala在JVM上运行。

Scala对XML有“本机”支持。您可以直接在Scala代码中构建XML、查找元素和匹配


示例:

是否有一种方法可以使用其他技术在Java中解决相同的设计问题?@Paul定义“解决”、“易于表示”、“自然表达”等。关于mixin组合,类似的问题在Java中通过使用对象(has-a)组合和依赖项注入来处理,但是这些技术引入了不必要的依赖关系和/或需要更多的样板文件。我不打算定义所有术语。我假设读者能解释。谢谢您的回复。我并不是真的想让您定义所有的术语。:)我的观点很简单,这个问题的定义有点不明确,因为这些术语太宽泛了。我当然不会考虑混音合成的代码重用,它可以在爪哇“很容易表示”,但听起来可能是这样。如果设计问题是优化问题,那么如果Scala解决方案更令人满意,Java“解决方案”是否无法解决设计问题?C“解决方案”合格吗?但可能可以做明确的解决方案?因此,这是一种方便(可以肯定是有用的),而不是表达上的差异。我感兴趣的是探索Scala在多大程度上允许你更“自然”地表达事物(对于“自然”的某些价值观),当我们用自然语言表达自己时,我们通常会忽略说话者和听话者都认为理所当然的上下文方面(共同点)类似地,在使用Scala编程时,我发现省略从上下文或默认假设中明确的参数或转换是很自然的。我会认为,并非所有Java字节码都可以从Java源程序生成?因此,Scalac可能会生成这种情况javac不能,反之亦然。这是真的,但scala并没有走这条路。scala发出的几乎所有字节都可以从JavaP发出