簡體   English   中英

Scala:使用TypeTag匹配Some的類型

[英]Scala: Using a TypeTag to match on a Some's type

請參見以下代碼:

def createOption[T: TypeTag](referentialData: Any) : Option[T] = {
  Option(referentialData) match {
    case Some(camelMessage: CamelMessage) => {
      Option(camelMessage.body) match {
        case Some(option: T) => Some(option)
        case _ => None
      }
    }
    case _ => None
  }
}

基本上,如果camelMessage.body為非null且類型為Option[T]則我希望返回Option[T] camelMessage.body Option(referentialData)的使用實際上是referentialData != null對於Option(camelMessage.body)

如何使用TypeTag確定camelMessage.body是否為T類型。

(我知道可以重寫為不使用TypeTags和Options,但是我想學習如何使用TypeTags,所以請不要提出任何重寫建議,謝謝!)

編輯

我嘗試了一種新方法,因為找不到上述解決方案,但也無法使該方法正常工作:

def createOption[T](referentialData: Any) : Option[T] = {
  Option(referentialData) match {
    case Some(option) => Try(option.asInstanceOf[T]).toOption
    case _ => None  
  }
}

當我使用createOption[Long]("test")調用此createOption[Long]("test")時,我想得到的是None ,但是我得到的是Some(String)我在哪里出錯了?

這是一個重復的這一個

但是您想嘗試使用ClassTag來顯示限制:

scala> def f[A: ClassTag](x: Any): Option[A] = x match {
     | case y: A => println("OK"); Some(y) ; case _ => println("Nope"); None }
f: [A](x: Any)(implicit evidence$1: scala.reflect.ClassTag[A])Option[A]

scala> f[String]("foo")
OK
res0: Option[String] = Some(foo)

scala> f[Long](2L)
Nope
res1: Option[Long] = None

scala> f[java.lang.Long](new java.lang.Long(2L))
OK
res2: Option[Long] = Some(2)

scala> def f[A: TypeTag](x: Any): Option[A] = Option(x) match {
     | case Some(y: A) => println("OK"); Some(y) ; case _ => println("Nope"); None }
<console>:51: warning: abstract type pattern A is unchecked since it is eliminated by erasure
       case Some(y: A) => println("OK"); Some(y) ; case _ => println("Nope"); None }
                    ^
f: [A](x: Any)(implicit evidence$1: reflect.runtime.universe.TypeTag[A])Option[A]

暫無
暫無

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

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