如果您恰好使用Type
(而不是TypeTag[T]
) - 在一般情況下爲否,因爲Type
的實例在編譯時不存儲任何信息:沒有存儲該信息的類型級別成員/參數。
因此,如果您在運行時使用Type
- 無法知道它對應的編譯時類型(什麼是您的演算函數的返回類型?_
?:))。
所以你的施法就必須有這樣的簽名:
在這種情況下
Type
def cast[T](o: Any, t: Type): T = o.asInstanceOf[T]
並不能真正幫助的(不像TypeTag[T]
)它不提供的T
類型推斷任何東西。即使conversion from Type to TypeTag[T]
顯然要求您明確指定類型,如cast[String]
等。
Type
可用於唯一的一點是,以檢查是否o
實際上對應t
:
def cast[T](o: Any, t: Type): Option[T] =
if (mirror.reflect(o).symbol == t.typeSymbol) Some(o.asInstanceOf[T]) else None
最多是這樣的:當你獲得
def cast[T: TypeTag](o: Any, t: Type): Option[T] =
if (mirror.reflect(o).symbol == t.typeSymbol && typeOf[T] =:= t)
Some(o.asInstanceOf[T])
else None
一個明顯的例外是一個Type
在宏裏面,所以你可以在編譯時編寫一個正確的asInstanceOf
樹:
https://groups.google.com/forum/#!topic/scala-user/3YF_98W9eSE