Scala: метаобъект для черт - PullRequest
       12

Scala: метаобъект для черт

1 голос
/ 29 сентября 2010

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

class Foo {
  def foo = "foo"
}

var obj = classOf[Foo]

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

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

1 Ответ

6 голосов
/ 29 сентября 2010

Вывод, приведенный выше, является для меня неожиданностью - он должен напечатать класс. Если вы не хотели объявить 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 так же, как вы делали бы это для классов.

...