更新到Scala 2.10时清单/类型标签出现问题
更新到Scala 2.10时清单/类型标签出现问题,scala,manifest,scala-2.10,Scala,Manifest,Scala 2.10,我坐在一个大约10000 LoC的项目前面。我必须将这个项目从Scala 2.9更新到2.10。这做得很好,但由于清单的原因,我收到了很多反对的警告。 在使用stackoverflow和许多其他网站的搜索功能后,我没有那么多问题。我想总结一下;重点是: 类型标签和类标签比清单和类清单好得多。特别是可以将它们用作同义词(TypeTags清单和ClassTags ClassManifest) TypeTag比ClassTag更强大,ClassTag分别是更受限制的TypeTag我的第一个问题:在这
我坐在一个大约10000 LoC的项目前面。我必须将这个项目从Scala 2.9更新到2.10。这做得很好,但由于清单的原因,我收到了很多反对的警告。
在使用stackoverflow和许多其他网站的搜索功能后,我没有那么多问题。我想总结一下;重点是:
manifest[T].erasure.getSimpleName方法。现在我不能只将其切换到typeTag[t].runtimeClass.getSimpleName
,因为代码不会编译,但使用classTag[t].runtimeClass.getSimpleName
它会编译这会影响语义吗?(注意:擦除
方法也被弃用;您必须改用runtimeClass
)
manifest[T]
是的,您主要拥有等价的TypeTag清单
和ClassTag类清单
。除了一些过去由清单处理的事情没有直接的等价物,因为这些操作被移到反射API的更深处,比如Manifest
对象上的工厂方法
ClassTag
现在基本上只用于获取某个东西的运行时(擦除)类。它的主要用途是创建数组,但您可以毫无问题地将其用于其他目的。所以是的,classTag[T].runtimeClass
是新的manifest[T].erasure
并且完全等同于它
这是变化最大的地方。2.10介绍了,当您想回答有关类型的特定问题时,应该使用它(如“doesA I还有一个问题:如何重写I.erasure
其中我是隐式清单[T],您应该用隐式ClassTag[T]替换隐式Manifest[T]
并调用i.runtimeClass
。谢谢,除了一件事之外,一切都是固定的:在一种方法中,我有一个TypeTag T
,但我需要挂件来manifest[T]。擦除。通常,我会使用classTag[T]。runtimeClass
,但这次我无法将TypeTag
重命名为classTag
(因为该方法是一个应用函数,许多方法调用该应用函数)@user2625693您可以从TypeTag
获得ClassTag
,请参见我的编辑。@gouraysama,如果您使用runtimeMirror(getClass.getClassLoader)
您很容易出现类加载错误,因为T
(它毕竟是由用户指定的)可以由任何类加载器加载,而不仅仅是使用classTag2
方法加载类的加载器。您最好使用typeTag[T]。mirror
。
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
}