Scala:Metaobject的特征

时间:2010-09-29 12:58:46

标签: scala metaprogramming

在Scala中,有java.lang.Classjava.lang.reflect.Method等元对象。但是特征存在什么元对象?

class Foo {
  def foo = "foo"
}

var obj = classOf[Foo]

obj // java.lang.Class[Foo] = interface Foo

打印界面。这是什么?

1 个答案:

答案 0 :(得分:6)

上面的输出让我感到惊讶 - 它应该打印一个类。除非你想宣布trait Foo。您使用的Scala版本是什么?

夜间作为输出提供以下内容:

Welcome to Scala version 2.9.0.r23117-b20100929093241 (Java HotSpot(TM) Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo {
     | def foo = "foo"
     | }
defined class Foo

scala> var obj = classOf[Foo]
obj: java.lang.Class[Foo] = class Foo

在Scala JVM实现中,Scala类通常被转换为JVM字节码类。如果一个特征只包含这里的方法声明:

trait Foo {
  def foo: String
}

Java接口Foo由编译器生成。

如果它也有定义,就像这里:

trait Foo {
  def foo = "foo"
}

编译器将生成一个接口Foo和一个名为Foo$class的所谓实现类,其中包含实际的方法体。程序员看不到此实现类。它用于引擎盖下的mixin-composition。

在这两种情况下,如果使用classOf构造来获取特征的Class对象,您将获得特征Foo的接口的标准Java类对象,您可以使用它检查Foo的方法的方法与对类的方法相同。