Scala 清单[T]。2.10中不推荐使用擦除,现在应该使用什么?

Scala 清单[T]。2.10中不推荐使用擦除,现在应该使用什么?,scala,generics,implicit,scala-2.10,erasure,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 {

我有以下代码:

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
已被弃用。对于相同的功能,我现在应该使用什么?

最简单的修复方法是将对
擦除的调用替换为对
运行时类的调用。如果使用
-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 )
}

这个替代方案比使用
清单
更能证明未来<代码>清单
将在2.10版或之后不久被弃用。有关更多信息,请参阅的“类型标记和清单”部分。

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

即:

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

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

def classOp[T我自己不熟悉这些工具的使用,但我相信您想了解的是
TypeTag
s。
def classOp[T <: Any : Manifest] {
  println("Class: " + manifest[T].runtimeClass.getName)
}