2010-09-29 3 views
1

В Scala есть метаобъекты, такие как java.lang.Class и java.lang.reflect.Method. Но какой метаобъект существует для черт?Scala: Метаобъект для черт

class Foo { 
    def foo = "foo" 
} 

var obj = classOf[Foo] 

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

Он печатает интерфейс. Что это?

+1

Err ... 2.8.0.final принты Скал java.lang.Class [Foo] = класс Foo Foo –

ответ

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 Scala JVM обычно переводится в класс JVM байт-кода. Если признак состоит только из объявлений методов, как здесь:

trait Foo { 
    def foo: String 
} 

интерфейс Java Foo генерируется компилятором.

Если имеет значения, как хорошо, как здесь:

trait Foo { 
    def foo = "foo" 
} 

компилятор генерирует интерфейс Foo и так называемый класс реализации с именем Foo$class, который содержит фактические тела методов. Этот класс реализации не отображается программисту. Он используется для смешивания композиции под капотом.

В обоих случаях, если вы используете classOf конструкцию, чтобы получить объект класса признака, вы получите стандартный объект класса Java для интерфейса признака Foo, который вы можете использовать для проверки методов Foo в так же, как и для классов.

+2

$ класс действительно достижим через некоторый обман, как: classOf [Foo] .getClassLoader.getClass ("Foo $ класс "). Но в общем-то и ответ. – jsuereth

+0

Ницца, не думал об этом. – axel22

Смежные вопросы