更新到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和许多其他网站的搜索功能后,我没有那么多问题。我想总结一下;重点是:

  • 类型标签和类标签比清单和类清单好得多。特别是可以将它们用作同义词(TypeTags清单和ClassTags ClassManifest)

  • TypeTag比ClassTag更强大,ClassTag分别是更受限制的TypeTag我的第一个问题:在这个项目中,经常使用
    manifest[T].erasure.getSimpleName方法。现在我不能只将其切换到
    typeTag[t].runtimeClass.getSimpleName
    ,因为代码不会编译,但使用
    classTag[t].runtimeClass.getSimpleName
    它会编译这会影响语义吗?(注意:
    擦除
    方法也被弃用;您必须改用
    runtimeClass

  • 第二个问题:Scala 2.9中清单的类型检查有点像:
    manifest[T]
    
  • 是的,您主要拥有等价的
    TypeTag清单
    ClassTag类清单
    。除了一些过去由清单处理的事情没有直接的等价物,因为这些操作被移到反射API的更深处,比如
    Manifest
    对象上的工厂方法

  • ClassTag
    现在基本上只用于获取某个东西的运行时(擦除)类。它的主要用途是创建数组,但您可以毫无问题地将其用于其他目的。所以是的,
    classTag[T].runtimeClass
    是新的
    manifest[T].erasure
    并且完全等同于它


  • 这是变化最大的地方。2.10介绍了,当您想回答有关类型的特定问题时,应该使用它(如“does
    A 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
    }