Scala .type и Java .class литерал - PullRequest
30 голосов
/ 25 мая 2011

Интересно, с точки зрения дизайна языка, почему Scala удалила литерал класса Java (например, String.class) и заменила его на classOf[String], но затем добавила «литерал типа» со своими синглетонами вроде Singleton.type вместо чего-токак typeOf[Singleton]?

Ответы [ 2 ]

30 голосов
/ 25 мая 2011

Вот мое рационализация:

classOf [T]

classOf определяется в Predef как функция с такой подписью:

def classOf[T]: Class[T]

Хотя это реализовано компилятором, использование синтаксиса функции возможно без необходимости создания какой-либо специальной обработки с точки зрения синтаксиса . Так что это одна из причин, чтобы рассмотреть этот вариант.

Альтернатива типа String.class подразумевает, что у каждого класса есть объект-компаньон с полем class. Итак, есть две проблемы:

  1. class является ключевым словом, поэтому возникает проблема, когда для синтаксиса для него требуется особый случай
  2. если вы просто создадите class A без объекта-компаньона, было бы странно иметь возможность ссылаться на A.class, что было бы похоже на доступ к полю class в спутник A.

A.type:

Почему typeOf[A] может сбивать с толку. Это похоже на вызов функции, но типы не живут в том же мире, что и результаты функции (у результатов функции есть типы, но сам тип имеет смысл только во время компиляции). Я могу приписать тип переменной:

scala> val a: A.type = A
a: A.type = A$@c21a68

Я не могу назначить тип, как будто он возвращен функцией:

scala> val b = A.type
<console>:1: error: identifier expected but 'type' found.
   val b = A.type
             ^

С другой стороны, типы могут быть членами объекта:

scala> object A { type type1 = Int }
defined module A

scala> val x: A.type1 = 1
x: A.type1 = 1

Так что A.type не является большим натяжением для ссылки на тип объекта A. Обратите внимание, что .type не используются за исключением ссылок на типы одноэлементных объектов, поэтому это не так часто.

11 голосов
/ 25 мая 2011

На самом деле, это вполне соответствует.Singleton.type является зависимым типом Singleton, в то время как classOf[Class] является параметром типа для метода.

Учтите это:

class A {
    class B
}

val a: A = new A
val b: a.B = new a.B

Суть в том, что .используется для обозначения чего-то, что является членом значения.Это может быть val, var, def или object, а также может быть type, class или trait.

, так какобъект singleton - это значение, тогда Singleton.type совершенно допустимо.

С другой стороны, класс является , а не объектом, поэтому Class.class не имеет смысла.Class не существует (как значение), поэтому получить членство в нем невозможно.С другой стороны, это определение, поскольку def classOf[T]: Class[T] является простым кодом Scala (даже если фактическая реализация является магией компилятора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...