亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是Scala中的清單,什么時候需要它?

什么是Scala中的清單,什么時候需要它?

縹緲止盈 2019-09-19 10:42:14
從Scala 2.7.2開始,有一些叫做ManifestJava類型擦除的解決方法。但是,如何Manifest確切地工作以及為什么/何時需要使用它?Jorge Ortiz 的博客文章Manifests:Reified Types解釋了其中的一些內容,但它沒有解釋如何將它與上下文界限一起使用。那么ClassManifest,有什么區別Manifest?我有一些代碼(一個更大的程序的一部分,不能輕易地包含在這里),它有關于類型擦除的一些警告; 我懷疑我可以通過使用清單解決這些問題,但我不確定如何解決。
查看完整描述

3 回答

?
阿晨1998

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編譯器可以創建一個類清單作為隱式參數傳遞給表格。


查看完整回答
反對 回復 2019-09-19
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

Manifest旨在重新定義在JVM上運行類型擦除的泛型類型(不支持泛型)。然而,他們有一些嚴重的問題:他們太簡單了,并且無法完全支持Scala的類型系統。因此它們在Scala 2.10中被棄用,并被替換為TypeTags(這實際上是Scala編譯器本身用于表示類型的內容,因此完全支持Scala類型)。



查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 552 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號