Spec-Zone.ru › Scala 2.13 Library

Пакет 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API