2010-12-07 45 views
3

我有一個值爲List[Any]的值和一個相應的列表ClassManifest[_],存儲值的原始類型。我如何將列表中的某些值恢復爲原始類型?在Scala中使用ClassManifest的任何值演繹值

def cast[T](x: Any, mf: ClassManifest[T]): T = x.asInstanceOf[T]不起作用。

謝謝你的回答。

+0

你的問題是相當similra:http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why-cant-i-get-該類型參數 – Nicolas 2010-12-07 12:24:39

回答

3

那永遠不可能工作,因爲返回類型cast將始終被視爲限制爲的任何T的最高常見超類型。在編譯時沒有辦法做到更具體。

如果你試圖建立不同類型的強類型集合,然後你真正想要的是一個HList:

http://jnordenberg.blogspot.com/2008/09/hlist-in-scala-revisited-or-scala.html

+0

Thx,它看起來很有趣,但我是否正確,現在HList是由10個元素限制? – fehu 2010-12-07 14:34:15

0

可以在Java/Scala的一個Class實例的方式投一個對象就是使用Class.cast的方法。所以,你可能會認爲你可以這樣做:

mf.erasure.cast(x) //T 

但是,這是行不通的,因爲mf.erasureClass[_](或Java中的Class<?>),所以劇組是沒有意義的(即不提供任何額外的信息)。這當然是使用非物化泛型的一個缺點。