Scala - TypeTags,ClassTags和WeakTypeTags的运行时性能

时间:2015-04-17 23:15:32

标签: scala reflection scala-reflect

简介

  

... TypeTag[T]封装了某些编译时类型T的运行时类型表示。 ...
  ... TypeTag总是由编译器生成。 ...... [1]

TypeTag位于scala.reflect.**个包中。 另一个SO answer提到使用java反射会在应用程序中产生运行时性能开销。

问题
TypeTag s,ClassTagWeakTypeTag在运行时使用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反射?

1 个答案:

答案 0 :(得分:3)

好吧,你可以看here。在您的情况下,不涉及Java反射,但=:=最终委托给isSameType2,这是非常重要的。它首先检查参考平等。