Вот мое рационализация:
classOf [T]
classOf
определяется в Predef
как функция с такой подписью:
def classOf[T]: Class[T]
Хотя это реализовано компилятором, использование синтаксиса функции возможно без необходимости создания какой-либо специальной обработки с точки зрения синтаксиса . Так что это одна из причин, чтобы рассмотреть этот вариант.
Альтернатива типа String.class
подразумевает, что у каждого класса есть объект-компаньон с полем class
. Итак, есть две проблемы:
class
является ключевым словом, поэтому возникает проблема, когда для синтаксиса для него требуется особый случай
- если вы просто создадите
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
не используются за исключением ссылок на типы одноэлементных объектов, поэтому это не так часто.