Object类或java.lang导入到scala包或任何类中?

问题描述 投票:0回答:1

据我了解,Scala的最终课程是任何课程。但是,我认为Scala是基于Java构建的,所以最终的类不是Object吗?我一直在检查文档,但我可能是错的,但是它没有显示Object是Any的父类,也看不到任何导入到Scala的java.lang包,应该是它的主干吗?

scala superclass scala-java-interop
1个回答
1
投票

您正在将Scala编程语言与其实现之一混淆。

A 编程语言是一组数学规则和限制。不多。它不是“用任何东西写的”(可能用英语写的),也不是“以任何东西为基础的”(也许写规范的纸除外)。

An [[Implementation”是一种软件,可以读取以编程语言编写的程序,然后以使得编程语言规范应说的确切内容发生的方式<< executes >>来执行该程序, do发生(在这种情况下,我们将实现称为Interpreter),或者它读取程序并以另一种语言输出另一个程序,以这样的方式执行that输出程序并为< [它的]语言使事情完全按照输入语言的规范所说的进行。无论哪种方式,编写实现的人都要确保自己的实现执行了规范规定的工作。因此,即使我正在编写“用Java构建”并用Java编写的Scala实现,我仍然需要确保Any是顶级类型,因为这就是Scala语言规范所说的。] >目前有三个主动维护的Scala实现,一个废弃的实现。

Scala的废弃实现是Scala.NET,它是针对公共语言基础结构的编译器。由于缺乏兴趣和资金,它被放弃了。 (基本上,所有可能会使用Scala.NET的用户都已经在使用F#。)

Scala当前维护的实现是:

Scala-native:针对unixoid操作系统和Windows的已编译实现。

Scala-js:针对ECMAScript和Web平台的已编译实现。

    Scala(一个不幸的名字,因为它与语言相同,所以很混乱):一个针对Java平台的编译实现。 “ Java平台”是指Java虚拟机和Java运行时环境,但是
  • not Java编程语言。
  • 这三个实现都是用Scala 100%编写的。实际上,它们不是三个完全独立的实现,它们使用具有不同后端的相同编译器前端,并且使用Scala标准库中用Scala编写的相同部分,并且仅重新实现用其他语言编写的部分。
  • 所以,
  • 正确的是,Scala的Java实现

    does

确实对java.lang.Object做了一些事情。但是,java.lang.Objectscala.Any的超类。实际上,它

不可能

,因为scala.Any是引用类型和值类型的根超类,而java.lang.Objectonly所有引用类型的根超类。因此,java.lang.Object实际上等效于scala.AnyRef,而不等于scala.Any。但是,java.lang.Object也不是scala.AnyRef的超类,而是两者都是same类。java.lang._ 自动导入,就像scala._一样。但是,此[[不是适用于Scala编程语言,它only适用于Scala编程语言的Java实现,不幸的是,其名称也为Scala。So,

only

对于这三个实现之一,陈述java.lang.Object是根类,但它不是scala.Any的超类,这是真实的说法。 相同类别scala.AnyRef但是同样,这仅适用于Scala的Java实现。例如,在Scala.NET中,根超类将用System.Object而不是java.lang.Object标识,并且等效于scala.Any而不是scala.AnyRef,因为CLI具有像Scala这样的统一类型系统,其中引用类型和值类型在同一类型系统中统一。而且我还没有检查Scala.js,但我认为它可以将Object标识为scala.AnyRef但是请注意,

此无

是因为实现是“构建”的。尝试合并Scala和Java / CLI / ECMAScript类层次结构的原因是为了[[interoperability
,这是为了轻松从Java / CLI / ECMAScript上的其他每种语言调用Scala代码平台,反之亦然,调用Scala用其他语言编写的代码。如果您不关心这一点,那么就没有必要跳过这些箍。
© www.soinside.com 2019 - 2024. All rights reserved.