Variable in Laufzeit-Typ aus existenziell typisiertem TypeCast in Scala @ umwande
Dieser Thread adressiert wie man @ benutTypeTag
, um den Laufzeittyp der Typparameter abzurufen, wenn sie mit @ verwendet werdeExistential
Art. Ein anderer Thread hat behandelt, wie eine Variable in ihren Laufzeit-Typ umgewandelt wird, der aus @ abgerufen wurdTypeTag
.
Meine Frage baut auf den oben genannten Threads auf (eine Art Kombination der beiden Szenarien). Aus Gründen der Übersichtlichkeit wurden Teile des Codes aus den beiden Threads dupliziert.
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
urz gesagt, die letzten beiden Zeilen:cast(value, TypeTag[_])
gibt immer einen Wert vom Typ @ zurüAny
. Aber meine Absicht ist es, diese Werte in den richtigen Typ umzuwandeln, der in @ gespeichert isDog|Cat.ttag
, was leider nicht @ iTypeTag[Int]
oderTypeTag[String]
aberTypeTag[_]
aufgrund der Verwendung vonexistential
Art. Gibt es eine Lösung dafür?
Edit 1:
Trotz des Feldesttag
ist vom TypTypeTag[_]
, ttag.tpe
hat den richtigen "Typ" (aber als Instanz vonreflect.runtime.universe.Type
). Ist es möglich das @ zu benutztypetag.tpe
auf den richtigen Typ umwandeln?