2016-07-26 71 views
1

我使用反射創建斯卡拉對象。我沒有「T」隨時訪問,鍵入鑄像一個對象通常會喜歡這樣的:有沒有一種使用反射類型轉換Scala對象的方法?

def makeOne[T](o:Object) = o.asInstanceOf[T] 

我有一個universe.Type壽。在我處理早些時候我做這樣的事情:

def analyze[T](o:Object)(implicit tt:TypeTag[T]) = {...} 

我救tt.tpe,這麼多後,當我創建類型T的對象,我已經失去了「T」,但我仍然保留TT .tpe。

有什麼辦法,我可以用這個來universe.Type型投我的對象,而不必需要「T」,如.asInstanceOf [T]?

(順便說一句,我可以使用反射就好創建對象......它只是創建的對象不知道它的類型。它只是認爲它的任何。)

+0

您遇到的主要問題是'asInstanceOf'是一個編譯時構造,但您使用的是運行時反射。 –

+0

如果你不知道你要投射到在編譯時那麼有什麼用鑄造的類型? –

+0

你應該保持'T'身邊 - 我想不出,你仍然可以有'tt'但在'T'無法通過的情況。另外,這聽起來有點像XY問題...... – Alec

回答

0

無形擁有設施圖如果演員陣容合理,就可以出演

scala> import shapeless._, Typeable._ 
import shapeless._ 
import Typeable._ 

scala> class C 
defined class C 

scala> val c: AnyRef = new C 
c: AnyRef = [email protected] 

scala> implicitly[Typeable[C]] 
res0: shapeless.Typeable[C] = Typeable[C] 

scala> res0.cast(c) 
res1: Option[C] = Some([email protected]) 

scala> res0.cast("nope") 
res2: Option[C] = None 

scala> val vs: AnyRef = List(1,2,3) 
vs: AnyRef = List(1, 2, 3) 

scala> implicitly[Typeable[List[Int]]].cast(vs) 
res3: Option[List[Int]] = Some(List(1, 2, 3)) 

scala> implicitly[Typeable[List[String]]].cast(vs) 
res4: Option[List[String]] = None 

我看到類型宏只是使用WeakTypeTag,你得到一個宏。當然,你可以傳遞一個Typeable作爲你想要的類型的表示。

相關問題