黑猴子的家:Scala ClassTag上下文界定

要实例化一个泛型的Array[T],我们需要一个ClassTag[T]对象。要想让基本类型的数组能正常工作的话,这是必需的。举例来说,如果T是Int,你会希望虚拟机中对应的是一个int[]数组。如果你编写的是一个构造泛型数据的泛型函数,则你需要帮它一下,传给它那个类标签(class tag)对象。用上下文界定即可,就像这样

import scala.reflect._
def makePair[T:ClassTag](first:T,second:T) = {
  val r = new Array[T](2);r(0) = first; r(1) = second; r
}

如果你调用makePair(4,9),编译器将定位到隐式的ClassTag[Int]并实际上调用makePair(4,9)(classTag)。这样一来,该方法调用的是ClassTag.newArray,在本例中这是一个将构造出基本类型数组int[2]的ClassTag[Int]。

为什么搞得这么复杂?在虚拟机中,泛型相关的类型信息是被抹掉的。这时只会有一个makePair方法,其却要处理所有类型T

转载于:https://www.jianshu.com/p/240f33c99b19

猜你喜欢

转载自blog.csdn.net/weixin_34377065/article/details/91182526