【问题标题】:Manifest[T].erasure is deprecated in 2.10, what should I use now?Manifest[T].erasure 在 2.10 中已弃用,我现在应该使用什么?
【发布时间】:2013-03-07 14:18:06
【问题描述】:

我有以下代码:

object Log {

  def get[T](implicit manifest : Manifest[T] ) = {
    LoggerFactory.getLogger( manifest.erasure.getName )
  }

  def getByName( name : String ) = {
    LoggerFactory.getLogger(name)
  }

}

想法是这样使用它:

object SimpleFuture {
  val log = Log.get[SimpleFuture[Throwable,Nothing]]
}

但是编译器 (2.10) 现在说 manifest.erasure 已弃用。我现在应该使用什么来实现相同的功能?

【问题讨论】:

  • 我自己不熟悉使用这些工具,但我相信你想研究的是TypeTags。

标签: scala generics implicit scala-2.10 erasure


【解决方案1】:

最简单的解决方法是将调用erasure 替换为调用runtimeClass。如果您使用-deprecation 运行,编译器实际上会给出该建议:

warning: method erasure in trait ClassManifestDeprecatedApis is deprecated: Use runtimeClass instead

或者,您可以使用类标签:

def get[T](implicit tag : reflect.ClassTag[T] ) = {
  LoggerFactory.getLogger( tag.runtimeClass.getName )
}

这种替代方案比使用Manifest 更具未来性。 Manifest 将在 2.10.something 或不久之后弃用。有关详细信息,请参阅this document 的“类型标签和清单”部分。

【讨论】:

    【解决方案2】:

    如果您像我一样只对避免弃用警告感兴趣,那么您也可以使用 ma​​nifest.runtimeClass.getName(而不是 manifest.erasure.getName)。

    IE:

    def classOp[T](implicit manifest: Manifest[T]) {
      println("Class: " + manifest.runtimeClass.getName)
    }
    

    我还发现了另一种我不完全理解的技术,可能有用也可能没用......

    def classOp[T <: Any : Manifest] {
      println("Class: " + manifest[T].runtimeClass.getName)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 2021-07-14
      • 2016-10-14
      • 2013-09-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多