3 回答

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

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