在Scala中,EVERYTHING是一个对象 - 是类对象吗?

时间:2016-02-08 10:07:13

标签: scala class oop reflection

我最近遇到了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 .__包装$ [...]

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

1 个答案:

答案 0 :(得分:2)

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

通常意味着"一切都是对象"每个值都是一个对象,即本机值,实例,函数。

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

res0.getClass

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

REPL没有给你一个"定义的A"因为你已经在其他环境中定义了它。

顺便说一下,您可以写scala.reflect.classTag[A].runtimeClass而不是classOf[A]