2017-09-20 51 views
0

投下一些物品是否可以藉助其Type投下一些物品。例如:藉助其類型

import scala.reflect.api.Types 

val t: Types#Type = ...// real type of the object o below 
println(t)   // out: com.project.Event[java.lang.String] 
val o: Any = ...  // some object which has above type 


val e: com.project.Event[java.lang.String] = cast(o, t) 

def cast(o: Any, t: Type) = ??? 

回答

0

我認爲你可以使用TypeTag用於固定類型信息和它轉換爲目標類型,如:

import scala.reflect.runtime.universe._ 

// get TypeTag by typeTag[A] 
val t: TypeTag[com.project.Event[java.lang.String]] = typeTag[com.project.Event[java.lang.String]] 

//cast with typeTag 
val r:com.project.Event[java.lang.String] = cast(o, t) 
def cast[A](o: Any, t: TypeTag[A]) = o.asInstanceOf[A] 

,如果你不能直接拿到TypeTag,也許你要轉換的TypeTypeTag

Get a TypeTag from a Type?

1

如果您恰好使用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