8

我有以下代码:

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推荐使用。我现在应该为同样的功能使用什么?

4

2 回答 2

10

最简单的解决方法是将调用替换为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 或不久之后弃用。有关详细信息,请参阅本文档的“类型标签和清单”部分。

于 2013-03-19T02:36:10.917 回答
3

如果像我一样,您只对避免弃用警告感兴趣,那么您也可以使用manifest.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)
}
于 2013-06-19T03:48:24.180 回答