【问题标题】:In Scala EVERYTHING is an Object - are Classes Objects?在 Scala 中,一切都是对象——类是对象吗?
【发布时间】:2016-02-08 21:45:29
【问题描述】:

我最近遇到了 scala.reflect.runtime API 并尝试通过 Stringevaluation 生成 Classdefinitins。 这是我在 scala REPL 中提出的方法:

scala> import scala.reflect.runtime._
import scala.reflect.runtime._

scala> val cm = universe.runtimeMirror(getClass.getClassLoader)
cm: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.n[....]

scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox

scala> val tb = cm.mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = scala.to[...]

scala> tb.eval(tb.parse("class A; scala.reflect.classTag[A].runtimeClass"))
res0: Any = class __wrapper$1$c6a9fb3f39c2499a9ff6e29384816f58.__wrapper$[...]

由于 REPL 的答案不是:

定义A类

但是

res0: 任何 = 类 __wrapper$1$c6a9fb3f39c2499a9ff6e29384816f58.__wrapper$[...]

我开始怀疑我是否真的创建了一个类或者只是初始化了一个抽象的 Any 实例? 我曾经在 scala 中读到过,一切都是对象。如果我的 REPL 中的 res0 现在实际上包含一个类,那么这意味着即使类也是 scala 中的对象?但这是我找不到更多输入的地方,所以我真的很困惑。 如果类不是 scala 中的对象,那么此时 res0 实际持有什么? 提前感谢您的帮助。

【问题讨论】:

  • 我已经在EntryLevelDevs Question 中寻找过类似的问题,但我的具体问题没有得到解答。它通常只关于作为对象的函数......
  • 是的,类就是对象。

标签: scala class oop reflection


【解决方案1】:

不,严格意义上的类不是对象,方法也不是。 Scala 在 JVM 上运行,Scala 类和方法编译为 JVM 的概念。

“一切都是对象”通常的意思是每个值都是对象,即原生值、实例、函数。

但是,有些对象可以让您访问类和方法的元信息。如果你这样做

res0.getClass

您会看到,res0 是 (Java) 类 Class 的一个实例。所以你刚刚从 JVM 反射 API 获得了一个对象。

REPL 没有为您提供“定义的 A 类”,因为您已在其他上下文中定义了它。

顺便说一句,你可以直接写classOf[A],而不是scala.reflect.classTag[A].runtimeClass

【讨论】:

  • "类不是对象" ???在您看来,.getClass 是否返回不是一个类或一个对象?
  • 它不返回一个类,只是一个类的句柄。这可能是对事物的技术观点。但是例如,类是可序列化的,但如果你反序列化它们,你只会得到一个同名类的句柄。此外,在语言层面上,Scala 并不真正支持将类视为对象的概念。没有类型可以真正表达,一个对象代表一个具有特定接口的类(即某些构造函数参数)。 classOf[T] 与 T 的这种关联纯粹发生在库级别。
  • 按照这个逻辑,字符串也不是对象:java.lang.String“不是字符串,只是字符串的句柄”。这不是“对事物的技术观点”,这是一个错误的观点。
  • @dth 我想我明白你的意思,但想想看,对象的句柄不也不是对象吗?我同意 scala 中的方法不是对象,尽管函数是。 scala 中的大多数其他东西都是对象,但是你总能找到在任何语言中都不是对象的东西。
  • 您看不到我的意思,这并没有错。 String 确实包含使字符串成为 String 的所有内容。它没有序列化问题。我不必在字符串上调用某些库函数就可以将其作为对象传递。也许我可以换一种说法:没有语言支持将类作为对象,只有库支持。
猜你喜欢
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多