我坐在一個約10000 LoC的項目前面。我必須將這個項目從Scala 2.9更新到2.10。這樣做很好,但由於清單,我得到了許多棄用警告。
使用了stackoverflow和許多其他網站的搜索功能後,我沒有太多的問題。我想總結一下;關鍵點是:更新到Scala時的清單/類型標籤問題2.10
TypeTags和ClassTags比Manifests和ClassManifest好得多。特別是可以使用這些作爲同義詞(類型標籤< - >艙單及ClassTags < - > ClassManifest)
類型標籤更強大比ClassTags,分別ClassTags是更受限制的類型標籤。 我的第一個問題:在這個項目中,經常使用方法
manifest[T].erasure.getSimpleName
。現在我不僅可以將其切換到typeTag[T].runtimeClass.getSimpleName
,因爲代碼不會編譯,但是會編譯爲classTag[T].runtimeClass.getSimpleName
。 這會影響語義嗎?(注:該方法erasure
也已過時,你必須使用runtimeClass
代替)第二個問題:在斯卡拉2.9清單的類型檢查是那種:
manifest[T] <:< manifest[A]
。在Scala 2.10中,我會寫這個typeOf[T] <:< typeOf[A]
。但<:<
已棄用?我可以將TypeTag轉換爲ClassTag嗎? I.e .:如果我只使用清單進行類型檢查(Nr。3)和名稱抽取(Nr。2):我能否將每個Manifest/ClassManifest重命名爲ClassTag?
我得到了另外一個問題:我如何可以重寫'i.erasure'其中i是一個隱式的清單[T] – funnyF
你應該用一個隱式的'ClassTag [T]'替換隱式的'Manifest [T]'並調用'i.runtimeClass'。 – gourlaysama
謝謝,一切都是固定免除的一件事:在一種方法中,我有一個'TypeTag T',但我需要吊墜'manifest [T] .erasure'。通常情況下,我會使用'classTag [T] .runtimeClass',但是這次我不想重命名'TypeTag'到'ClassTag'(因爲這個方法是一個apply函數,很多方法調用這個apply函數) – funnyF