7

简介

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

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

问题:s、s 和s 在运行时在
多大程度上使用 java 反射?它们是在编译时生成的,但在使用时会导致运行时性能开销吗?TypeTagClassTagWeakTypeTag

示例

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 反射?

4

1 回答 1

3

嗯,你可以看看这里。在您的情况下,不涉及 Java 反射,但=:=最终委托给isSameType2,这是非常重要的。它确实首先检查引用相等性。

于 2015-04-18T06:03:13.587 回答