3 回答

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
不是一個(gè)完整的答案,但對于之間的區(qū)別Manifest和ClassManifest,你可以找到一個(gè)例子斯卡拉2.8 Array紙:
唯一剩下的問題是如何實(shí)現(xiàn)通用數(shù)組創(chuàng)建。與Java不同,Scala允許實(shí)例創(chuàng)建new Array[T],其中T是類型參數(shù)??紤]到Java中不存在統(tǒng)一的數(shù)組表示,如何實(shí)現(xiàn)它?
執(zhí)行此操作的唯一方法是需要額外的運(yùn)行時(shí)信息來描述類型T。Scala 2.8有一個(gè)新的機(jī)制,稱為Manifest。類型對象Manifest[T]提供有關(guān)類型的完整信息T。
Manifest值通常在隱式參數(shù)中傳遞; 并且編譯器知道如何為靜態(tài)已知類型構(gòu)造它們T。
還存在一個(gè)較弱的命名形式ClassManifest,它可以通過只知道一個(gè)類型的頂級類來構(gòu)造,而不必知道它的所有參數(shù)類型。
正是這種類型的運(yùn)行時(shí)信息是數(shù)組創(chuàng)建所必需的。
例:
需要通過將ClassManifest[T]方法作為隱式參數(shù)傳遞給方法來提供此信息:
def tabulate[T](len:Int, f:Int=>T)(implicit m:ClassManifest[T]) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
作為簡寫形式,可以在類型參數(shù)上使用上下文bound1 T,
(見這個(gè)問題的插圖)
給予:
def tabulate[T: ClassManifest](len:Int, f:Int=>T) = {
val xs = new Array[T](len)
for (i <- 0 until len) xs(i) = f(i)
xs
}
當(dāng)在類型上調(diào)用tabulate時(shí)Int,或者,或者String,或者List[T],Scala編譯器可以創(chuàng)建一個(gè)類清單作為隱式參數(shù)傳遞給表格。

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
Manifest旨在重新定義在JVM上運(yùn)行類型擦除的泛型類型(不支持泛型)。然而,他們有一些嚴(yán)重的問題:他們太簡單了,并且無法完全支持Scala的類型系統(tǒng)。因此它們在Scala 2.10中被棄用,并被替換為TypeTags(這實(shí)際上是Scala編譯器本身用于表示類型的內(nèi)容,因此完全支持Scala類型)。
- 3 回答
- 0 關(guān)注
- 544 瀏覽
添加回答
舉報(bào)