2017-03-01 24 views
1

喜歡的東西:斯卡拉施放任何對選項[T]

def cast[T](o: Any): Option[T] = o match { 
    case v: T => Some(v) 
    case _ => None 
    } 

或:

def cast[T](c: Class[T], o: Any): Option[T] = o match { 
    case v: T => Some(v) 
    case _ => None 
    } 

這是一個好主意?是否有一個標準庫相當於?

爲什麼我得到,我如何解決以下Scala編譯器警告:

Warning:(7, 13) abstract type pattern T is unchecked since it is eliminated by erasure 
    case v: T => Some(v) 
+1

你並不需要特殊的方法:'scala.util.Try(o.asInstanceOf [T])toOption' – Yawar

+0

@Yawar這是最簡潔並嚴格依賴標準庫,但涉及使用異常作爲流量控制。它有效,但我會採取pamu的解決方案。 – clay

回答

2

使用類標籤。類型信息在運行時會丟失。因此,您需要提供可以使用類標記完成的類型信息。

import scala.reflect.ClassTag 

def cast[T: ClassTag](o: Any): Option[T] = o match { 
case v: T => Some(v) 
case _ => None 
} 

斯卡拉REPL

scala> cast[String]("hello") 
res2: Option[String] = Some(hello) 

scala> cast[Int]("scala") 
res3: Option[Int] = None 
+2

現在,試着'cast [List [String]](List [Int](1,2,3))''。 –