清单[T] .erasure在2.10中已弃用,我现在应该使用什么?

时间:2013-03-19 02:22:42

标签: scala generics implicit scala-2.10 erasure

我有以下代码:

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。我现在应该使用什么来实现相同的功能?

2 个答案:

答案 0 :(得分: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或之后不久弃用。有关详细信息,请参阅this document的“类型标记和清单”部分。

答案 1 :(得分:2)

如果像我一样,您只对避免弃用警告感兴趣,那么您也可以使用 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)
}