Начиная с Scala 2.7.2 существует так называемый Manifest
способ обхода стирания типов Java. Но как Manifest
именно работает и зачем / когда это нужно использовать?
Сообщение в блоге Хорхе Ортиса « Manifests: Reified Types » объясняет некоторые из них, но не объясняет, как их использовать вместе с ограничениями контекста .
Кроме того ClassManifest
, в чем разница Manifest
?
У меня есть код (часть более крупной программы, не могу легко включить его сюда), в котором есть некоторые предупреждения относительно стирания типа; Я подозреваю, что могу решить эти проблемы с помощью манифестов, но я не уверен, как именно.
Ответы:
Компилятор знает больше информации о типах, чем может легко представить среда выполнения JVM. Манифест - это способ компилятора отправить межпространственное сообщение коду во время выполнения о потерянной информации о типе.
Это похоже на то, как клептонианцы оставили закодированные сообщения в окаменелостях и «мусорной» ДНК людей. Из-за ограничений скорости света и полей гравитационного резонанса они не могут общаться напрямую. Но, если вы знаете, как настроиться на их сигнал, вы можете получить выгоду невообразимыми способами, решив, что поесть на обед или какое число в лотерею сыграть.
Неясно, принесет ли Манифест пользу ошибкам, которые вы видите, не зная более подробностей.
Одним из распространенных способов использования манифестов является изменение поведения вашего кода в зависимости от статического типа коллекции. Например, что, если вы хотите обрабатывать List [String] иначе, чем другие типы List:
Решение на основе отражения, вероятно, будет включать проверку каждого элемента списка.
Ограничение контекста кажется наиболее подходящим для использования классов типов в scala, и здесь это хорошо объясняет Дебасиш Гош: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Границы контекста также могут просто сделать сигнатуры методов более читабельными. Например, указанная выше функция может быть переписана с использованием таких контекстных границ:
источник
Не полный ответ, но о разнице между
Manifest
иClassManifest
, вы можете найти пример в 2,8 ScalaArray
бумаги :Пример:
(См. Этот вопрос SO для иллюстрации )
источник
Манифест был предназначен для повторного преобразования универсальных типов, которые стираются для запуска на JVM (которая не поддерживает универсальные типы). Однако у них были серьезные проблемы: они были слишком упрощенными и не могли полностью поддерживать систему типов Scala. Таким образом, они были объявлены устаревшими в Scala 2.10 и заменены на
TypeTag
s (которые, по сути, являются тем, что сам компилятор Scala использует для представления типов и, следовательно, полностью поддерживает типы Scala). Подробнее о различиях см .:Другими словами
До 04.01.2013, когда была выпущена Scala 2.10 .
источник
Давайте также ПРЫ из
manifest
вscala
источниках (Manifest.scala
), мы видим:Итак, что касается следующего примера кода:
мы видим, что
manifest
function
поиск неявного,m: Manifest[T]
который удовлетворяетtype parameter
предоставленному вами в нашем примере кода, былmanifest[String]
. Итак, когда вы вызываете что-то вроде:вы проверяете, имеет ли ток,
implicit m
который вы определили в своей функции, тип,manifest[String]
и, посколькуmanifest
это функция типа,manifest[T]
он будет искать конкретный,manifest[String]
и он обнаружит, есть ли такой неявный.источник