Пакет scala.reflect
пакет reflect
- Источник
- package.scala
Члены типа
абстрактный класс AnyValManifest[T <: AnyVal] extends Manifest[T] с Equals
- Аннотации
- @SerialVersionUID()
тракт ClassTag[T] extends ClassManifestDeprecatedApis[T] с Equals с Serializable
A ClassTag[T] хранит стёртый класс заданного типа T, доступный через поле runtimeClass. Это особенно полезно для создания экземпляров Array с типами элементов, неизвестными на этапе компиляции.
ClassTag — это более слабое частное случая scala.reflect.api.TypeTags#TypeTag, так как они оборачивают только класс времени выполнения заданного типа, тогда как TypeTag содержит всю статическую информацию о типе. То есть ClassTag строятся, зная только верхний класс типа, не обязательно зная все его аргументы типа. Эта информация времени выполнения достаточна для создания экземпляров Array во время выполнения.
Например:
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( msg = "No ClassTag available for ${T}" )
тракт Manifest[T] extends ClassManifest[T] с 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, classManifest, 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: ClassManifest] = classManifest[T].erasure.getMethods
def retType[T: ClassManifest](name: String) =
methods[T] find (_.getName == name) map (_.getGenericReturnType)
retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
- Аннотации
- @implicitNotFound( msg = "No Manifest available for ${T}." )
тракт OptManifest[+T] extends Serializable
OptManifest[T] — это необязательный scala.reflect.Manifest.
Он либо Manifest , либо значение NoManifest.
тип ClassManifest[T] = ClassTag[T]
ClassManifest[T] — это непрозрачный дескриптор типа T. Он используется компилятором для сохранения информации, необходимой для создания экземпляров Arrays в тех случаях, когда тип элемента неизвестен на этапе компиляции.
Операторы отношений типов стремятся представить более точную картину, чем можно получить с помощью стёртых типов, но нельзя полагаться на них для получения правильных ответов. В частности, они, скорее всего, будут неправильными, когда речь идёт о вариативности или когда подтип имеет другое количество аргументов типа, чем супертип.
- Аннотации
- @deprecated @implicitNotFound( msg = ... )
- Устаревшее
(С версии 2.10.0) используйте scala.reflect.ClassTag вместо этого
тракт ClassManifestDeprecatedApis[T] extends OptManifest[T]
- Аннотации
- @deprecated
- Устаревшее
(С версии 2.10.0) используйте scala.reflect.ClassTag вместо этого
Значения членов
val Manifest: ManifestFactory.type
Объект Manifest определяет методы фабрики для манифестов. Он предназначен для использования компилятором и не должен использоваться в клиентском коде.
def classTag[T](implicit ctag: ClassTag[T]): ClassTag[T]
def ensureAccessible[T <: AccessibleObject](m: T): T
Делает объект Java reflection доступным, если он еще не доступен и это возможно. Если при попытке возникает исключение SecurityException, оно перехватывается и отбрасывается.
object ClassManifestFactory
ClassManifestFactory определяет методы фабрики для манифестов. Он предназначен для использования компилятором и не должен использоваться в клиентском коде.
В отличие от ClassManifest, эта фабрика не аннотирована предупреждением о устаревании. Это делается для предотвращения лавины предупреждений об устаревании в коде, который вызывает методы с манифестами.
В идеальном мире мы бы просто удалили аннотацию @deprecated из ClassManifest объекта, а затем удалили его в версии 2.11. Ведь этот объект явно помечен как внутренний, так что никто не должен его использовать. Однако многие существующие библиотеки игнорировали Scaladoc, который поставляется с ClassManifest, поэтому нам нужно как-то подтолкнуть их к миграции до удаления чего-либо без предупреждения. Поэтому мы приняли это решение как меньшее из зол.
object ClassTag extends Serializable
object ManifestFactory
ManifestFactory определяет методы фабрики для манифестов. Он предназначен для использования компилятором и не должен использоваться в клиентском коде.
В отличие от Manifest, эта фабрика не аннотирована предупреждением о устаревании. Это делается для предотвращения лавины предупреждений об устаревании в коде, который вызывает методы с манифестами. Почему так сложно? Прочитайте комментарии к ClassManifestFactory.
object NameTransformer
Предоставляет функции для кодирования и декодирования символических имен Scala. Также предоставляет некоторые константы.
object 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.12.9/scala/reflect/index.html