Transmitir uma variável ao tipo de tempo de execução do TypeCast existencial digitado no Scala
Esta discussão abordado como usarTypeTag
para obter o tipo de tempo de execução dos parâmetros de tipo quando usado comExistential
tipo.Outra discussão abordou como converter uma variável em seu tipo de tempo de execução recuperado deTypeTag
.
Minha pergunta baseia-se nos tópicos acima mencionados (uma espécie de combinação dos dois cenários). Partes do código são duplicadas dos dois threads para maior clareza.
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> def cast[A](a: Any, tt: TypeTag[A]): A = a.asInstanceOf[A]
cast: [A](a: Any, tt: reflect.runtime.universe.TypeTag[A])A
scala> abstract class Animal[T](implicit tt: TypeTag[T]) {
| val ttag = tt
| }
defined class Animal
scala> case object Dog extends Animal[Int]
defined object Dog
scala> case object Cat extends Animal[String]
defined object Cat
scala> val aa: List[(Animal[_], Any)] = List((Dog, 5), (Cat, "stringgg"), (Dog, 2))
aa: List[(Animal[_], Any)] = List((Dog,5), (Cat,stringgg), (Dog,2))
scala> aa(0)._1.ttag
res25: reflect.runtime.universe.TypeTag[_] = TypeTag[Int]
scala> aa(1)._1.ttag
res26: reflect.runtime.universe.TypeTag[_] = TypeTag[String]
scala> cast(aa(0)._2, aa(0)._1.ttag)
res27: Any = 5
scala> cast(aa(1)._2, aa(1)._1.ttag)
res28: Any = stringgg
Em resumo, as duas últimas linhas:cast(value, TypeTag[_])
sempre retorne um valor do tipoAny
. Mas minha intenção é converter esses valores no tipo correto armazenado emDog|Cat.ttag
, que infelizmente não éTypeTag[Int]
ouTypeTag[String]
masTypeTag[_]
devido ao uso deexistential
tipo. Existe alguma solução para isso?
Editar 1:
Apesar do campottag
é do tipoTypeTag[_]
, ttag.tpe
tem o "tipo" certo (mas como uma instância dereflect.runtime.universe.Type
) É possível usar otypetag.tpe
transmitir para o tipo certo?