Как я могу получить пустую коллекцию того же типа, что и данный экземпляр? - PullRequest
2 голосов
/ 04 июня 2019

Как часть механизма переписывания, мне нужно получить и выполнить конструктор коллекции того же типа, что и данный экземпляр.Приведенный ниже код обобщает мою попытку.

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 Ответ

6 голосов
/ 04 июня 2019

Правильный путь (в 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()

Нет необходимости в отражении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...