更新到Scala 2.10时清单/类型标记出现问题
我坐在一个大约10000 LoC的项目前.我必须将此项目从
Scala 2.9更新到2.10.这样做得很好,但由于清单,我收到了许多弃用警告.
? 在使用stackoverflow和许多其他站点的搜索功能之后,我没有那么多问题.我想总结一下;关键点是: > TypeTags和ClassTag比Manifest和ClassManifest好得多.特别是你可以将它们用作同义词(TypeTags< - > Manifest和ClassTags< - > ClassManifest) 解决方法
>是的,你大多数都有等价的TypeTag< - > Manifest和ClassTag< - > ClassManifest.除了有些东西过去由Manifest处理,没有直接的等价物,因为这些操作被深入到反射API中,就像Manifest对象上的工厂方法一样.
> ClassTag现在基本上只用于获取运行时(擦除)类的东西.它主要用于创建数组,但您可以毫无问题地将其用于其他目的.所以是的,classTag [T] .runtimeClass是新的清单[T] .erasure并且完全等同于它. >这是变化最大的地方. 2.10引入了 new reflection API,当你想回答关于类型的具体问题时你应该使用它(比如“A<:< B?”).而类型的反射API的入口点是......它的TypeTag. 假设A和T的类型标签在范围内,则新清单[T]<:< manifest [A]确实是typeOf [T]<:< TYPEOF [A].方法<:<这里没有弃用,see the scaladoc.但是有一个弃用的<:<在ClassTag中,因为ClassManifest曾经有一个,而ClassTag是新的ClassManifest. 请参阅反射指南的 Common Operations on Types部分和SO问题 What is a TypeTag and how do I use it. >我认为没有直接的方法可以从TypeTag转到ClassTag.想一想: >如果你需要子类型或类型相等检查,你不能使用ClassTag,你需要一个TypeTag; 编辑:我刚刚找到this SO question,所以是的,可以从TypeTag获得ClassTag.遗憾的是,反射库中没有任何辅助方法. 编辑2:根据要求,以下是如何从TypeTag转换为ClassTag: import reflect.runtime.universe._ import reflect.ClassTag def classTag2[T: TypeTag]: ClassTag[T] = { ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) ) } // example: def doSomething[T : TypeTag] = { val c = classTag2[T] c.runtimeClass.getName } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |