Скала - время выполнения работы TypeTags, ClassTags и WeakTypeTags
введение:
...
TypeTag[T]
инкапсулирует представление типа среды выполнения некоторого типа времени компиляцииT
. ...
...TypeTag
s всегда генерируются компилятором. ... [1]
TypeTag
s расположены в scala.reflect.**
пакеты.
Другой так что ответ упоминает, что использование отражения java приведет к накладным расходам производительности во время выполнения приложение.
вопрос:
До какой степениTypeTag
s,ClassTag
s и WeakTypeTag
s использовать отражение java во время выполнения? Они генерируются во время компиляции, но вызывают ли они накладные расходы во время выполнения при использовании?
пример:
def isOfType[A : ClassTag : TypeTag, E : ClassTag : TypeTag](actual: A, expected: E): Boolean = {
actual match {
case _ : E if typeOf[A] =:= typeOf[E] => true
case _ => false
}
}
assert( isOfType(List.empty[Int], List.empty[Int]))
assert(!isOfType(List.empty[String], List.empty[Int]))
хотя теги генерируются во время компиляции, я могу чувствовать задержка при запуске. Используют ли сравнения типов отражение java не-так-performant под капотом?
1 ответов
Ну, вы можете посмотреть здесь. В вашем случае отражение Java не участвует, но =:=
в конечном итоге делегаты на isSameType2
, что довольно нетривиально. Сначала он проверяет равенство ссылок.