Скала - время выполнения работы TypeTags, ClassTags и WeakTypeTags

введение:

... TypeTag[T] инкапсулирует представление типа среды выполнения некоторого типа времени компиляции T. ...
... TypeTags всегда генерируются компилятором. ... [1]

TypeTags расположены в scala.reflect.** пакеты. Другой так что ответ упоминает, что использование отражения java приведет к накладным расходам производительности во время выполнения приложение.

вопрос:
До какой степениTypeTags,ClassTags и WeakTypeTags использовать отражение 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, что довольно нетривиально. Сначала он проверяет равенство ссылок.