Можно ли определить манифест на основе другого манифеста в Scala?
Я почти смирился с убеждением, что это невозможно, поскольку информация о манифесте Scala не предназначена для использованиядинамически.
Вот проблема.У меня есть функция, которая может возвращать более одного типа объекта (String, Int, List [Int], List [List [String]] и т. Д.) Для поддержки этих нескольких типов тип возвращаемого значения установлен на Any, но из-задля стирания типа информация о типах, поддерживаемых в списках, картах и т. д., теряется.В попытке восстановить некоторые детали я возвращаю Манифест вместе с типом возвращаемого значения.
Однако возвращаемая информация затем может быть помещена в другой список или карту и затем возвращена из другой функции.Я хочу обновить манифест, включив в него тот факт, что тип теперь является списком или картой предыдущего типа, как это определено в манифесте.
Вот пример кода
def returnWithManifest[T: Manifest](x: T) = (x, manifest[T])
// May return String, Int, List[Int], List[List[String]], ...
def contrivedExample(t: String): (Any, Manifest[_]) = t match {
case "String" => returnWithManifest("test")
case "Int" => returnWithManifest(1)
case "Boolean" => returnWithManifest(true)
case "List[Int]" => returnWithManifest(List(1,2,3))
case "List[List[String]]" =>
returnWithManifest(List(List("a","b"),List("c","d")))
case _ => returnWithManifest(None)
}
scala> val v1 = contrivedExample("List[Int]")
v1: (Any, Manifest[_]) = (List(1, 2, 3),scala.collection.immutable.List[Int])
scala> val x = v1._1
x: Any = List(1, 2, 3)
scala> val m = v1._2
m: scala.reflect.Manifest[_] = scala.collection.immutable.List[Int]
scala> val v2 = List(x)
v2: List[Any] = List(List(1, 2, 3))
Из манифеста 'v1' я знаю, что v1 имеет тип List [Int], поэтому, когда я создаю 'v2', у меня должна быть вся информацияМне нужно создать манифест, определяющий, что типом является List [List [Int]], но вместо этого у меня есть только List [Any] для работы.Возможно синтаксис, подобный следующему:
val v2: m = List(x)
val v2 = List[m](x)
Я понимаю, что похоже, что я пытаюсь определить тип динамически, но на самом деле информация - это метаданные, связанные со стиранием типов статически известных типов.Я думаю, что если это можно решить, то стирание типа может быть решено.Однако, по крайней мере, я думал, что смогу сделать что-то вроде:
scala> val m2 = m.wrapInList()
m2: scala.reflect.Manifest[_] =
scala.collection.immutable.List[scala.collection.immutable.List[Int]]