如何获得与给定实例相同类型的空集合?

时间:2019-06-04 16:25:09

标签: scala reflection constructor

作为重写机制的一部分,我需要获取并执行与给定实例相同类型的集合构造函数。下面的代码总结了我的尝试。

import scala.reflect.runtime.universe.TypeTag
def getEmptyCollection[N : TypeTag](collection: N): N = {
  val runtime = scala.reflect.runtime.universe
  val mirror = runtime.runtimeMirror(getClass.getClassLoader)
  val classSymbol = runtime.typeOf[N].typeSymbol.asClass
  val classMirror = mirror.reflectClass(classSymbol)
  val constructorSymbol = runtime.typeOf[N].decl(runtime.termNames.CONSTRUCTOR).asMethod
  val constructorMirror = classMirror.reflectConstructor(constructorSymbol)
  constructorMirror()
}

val emptyList: List[Int] = getEmptyCollection(List(1, 2, 3))

但是,此代码会产生实例化异常: 抛出了java.lang.InstantiationException

也许“ typeOf [N]”是问题,但我只是在猜测。您知道可能是什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:6)

正确的方法(在Scala 2.12中,可能在2.13中有所不同,而2.11将需要显式类型参数):

import scala.collection.generic.GenericTraversableTemplate
import scala.collection.GenTraversable

def getEmptyCollection[A, CC[X] <: GenericTraversableTemplate[X, CC] with GenTraversable[X]](collection: CC[A]) = 
  collection.genericBuilder[A].result()

println(getEmptyCollection(List(1, 2))) // List()
println(getEmptyCollection(Vector(1, 2))) // Vector()

不需要反射!