作为重写机制的一部分,我需要获取并执行与给定实例相同类型的集合构造函数。下面的代码总结了我的尝试。
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]”是问题,但我只是在猜测。您知道可能是什么问题吗?
谢谢!
答案 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()
不需要反射!