Вывод, приведенный выше, является для меня неожиданностью - он должен напечатать класс. Если вы не хотели объявить 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
, который содержит фактические тела методов. Этот класс реализации не виден программисту. Используется для миксин-композиции под капотом.
В обоих случаях, если вы используете конструкцию classOf
для получения объекта Class признака, вы получите стандартный объект класса Java для интерфейса признака Foo
, который можно использовать для проверки методов Foo
так же, как вы делали бы это для классов.