Пакет scala.reflect
пакет reflect
- Источник
- package.scala
- Линейные супертипы
- AnyRef, Any
Члены типа
абстрактный класс AnyValManifest[T <: AnyVal] extends Manifest[T] with Equals
- Аннотации
- @SerialVersionUID()
тракт ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with Serializable
A ClassTag[T] хранит стёртый класс заданного типа T, доступный через поле runtimeClass. Это особенно полезно для создания Array объектов, типы элементов которых неизвестны на этапе компиляции.
ClassTag — это более слабый частный случай scala.reflect.api.TypeTags#TypeTag, так как они оборачивают только класс времени выполнения заданного типа, в то время как TypeTag содержит всю статическую информацию о типе. То есть, ClassTag создаются, зная только верхний класс типа, без необходимости знать все типы его аргументов. Эта информация о времени выполнения достаточна для создания Array объектов в runtime.
Например:
scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> mkArray(42, 13)
res0: Array[Int] = Array(42, 13)
scala> mkArray("Japan","Brazil","Germany")
res1: Array[String] = Array(Japan, Brazil, Germany)
См. scala.reflect.api.TypeTags для дополнительных примеров или Руководство по рефлексии: TypeTags для более подробной информации.
- Аннотации
- @implicitNotFound("Нет ClassTag доступен для ${T}")
тракт Manifest[T] extends ClassManifest[T] with Equals
Manifest[T] — это неявный описатель типа T. Его использование заключается в предоставлении доступа к стиранию типа в виде экземпляра Class, что необходимо для создания нативных Arrays объектов, если класс неизвестен на этапе компиляции.
Операторы отношений типов <:< и =:= следует рассматривать только как приближения, так как существует множество аспектов соответствия типов, которые пока не адекватно представлены в манифестах.
Примеры использования:
def arr[T] = new Array[T](0) // does not compile
def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles
def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding
// Methods manifest and optManifest are in [[scala.Predef]].
def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U]
isApproxSubType[List[String], List[AnyRef]] // true
isApproxSubType[List[String], List[Int]] // false
def methods[T: Manifest] = manifest[T].runtimeClass.getMethods
def retType[T: Manifest](name: String) =
methods[T] find (_.getName == name) map (_.getGenericReturnType)
retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
- Аннотации
- @implicitNotFound("Нет Manifest доступен для ${T}.")
тракт OptManifest[+T] extends Serializable
OptManifest[T] — это необязательный scala.reflect.Manifest.
Это либо Manifest, либо значение NoManifest.
Члены значения
def classTag[T](implicit ctag: ClassTag[T]): ClassTag[T]
def ensureAccessible[T <: AccessibleObject](m: T): T
Делает объект отражения Java доступным, если он еще не доступен, и это возможно. Если при попытке этого возникает SecurityException, она перехватывается и игнорируется.
объект ClassManifestFactory
ClassManifestFactory определяет методы-фабрики для манифестов. Предназначен для использования компилятором и не должен использоваться в клиентском коде.
В отличие от ClassManifest, эта фабрика не имеет аннотации с предупреждением об устаревании. Это сделано для предотвращения лавины предупреждений об устаревании в коде, который вызывает методы с манифестами.
В идеальном мире мы бы просто удалили аннотацию @deprecated из ClassManifest объекта, а затем удалили его в версии 2.11. Ведь этот объект явно помечен как внутренний, поэтому его никто не должен использовать. Однако многие существующие библиотеки игнорировали Scaladoc, который поставляется с ClassManifest, поэтому нам нужно как-то подтолкнуть их к миграции до того, как мы удалим вещи без предупреждения. Поэтому мы ввели это решение как меньшее из двух зол.
объект ClassTag extends java.io.Serializable
объект Manifest extends java.io.Serializable
Объект Manifest определяет методы-фабрики для манифестов. Предназначен для использования компилятором и не должен использоваться в клиентском коде.
объект ManifestFactory
ManifestFactory определяет методы-фабрики для манифестов. Предназначен для использования компилятором и не должен использоваться в клиентском коде.
В отличие от Manifest, эта фабрика не имеет аннотации с предупреждением об устаревании. Это сделано для предотвращения лавины предупреждений об устаревании в коде, который вызывает методы с манифестами. Почему так сложно? Почитайте комментарии к ClassManifestFactory.
объект NameTransformer
Предоставляет функции для кодирования и декодирования символьных имен Scala. Также предоставляет некоторые константы.
объект NoManifest extends OptManifest[Nothing] with Serializable
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala/reflect/index.html