簡體   English   中英

在Scala中,如何在TypeTag可用時轉換值

[英]In Scala, how to cast a value when a TypeTag is available

特定

  • 類型為Any的值
  • 與所需類型對應的TypeTag

我怎樣才能施展價值

不幸的是,以下代碼段無法編譯

val v: Any = 123
val tag    = typeTag[Int]
val i      = v.asInstanceOf[t.tpe]

用這個

import scala.reflect.ClassTag

def getTypedArg[T: ClassTag](any: Any): Option[T] = {
      any match {
        case t: T => Some(t)
        case invalid =>
          None
      }
}

用法

scala> getTypedArg[Int](5)
res1: Option[Int] = Some(5)

scala> getTypedArg[Int]("str")
res2: Option[Int] = None

來源: 從ClassTag中檢索類名


編輯-1

正如@Aki所要求的那樣 ,也可以通過這種黑客攻擊TypeTag

import reflect.runtime.universe._
import scala.reflect.ClassTag

def typeToClassTag[T: TypeTag]: ClassTag[T] = {
  ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}

def getTypedArg2[T: TypeTag](any: Any): Option[T] = {
  implicit val c: ClassTag[T] = typeToClassTag[T]
  any match {
    case t: T => Some(t)
    case invalid =>
      None
  }
}

參考: 如何同時獲取ClassTag表單TypeTag或兩者?

您可以編寫自己的方法來執行轉換。
(請注意,此方法永遠不會拋出ClassCastExceptions)

def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM