在Scala中,有java.lang.Class
和java.lang.reflect.Method
等元对象。但是特征存在什么元对象?
class Foo {
def foo = "foo"
}
var obj = classOf[Foo]
obj // java.lang.Class[Foo] = interface Foo
打印界面。这是什么?
答案 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
的方法的方法与对类的方法相同。