我有以下代码:
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已被弃用。我现在应该使用什么来实现相同的功能?
发布于 2013-03-19 10:36:11
最简单的修复方法是用runtimeClass调用替换对erasure的调用。如果您使用-deprecation运行,编译器实际上会给出这个建议:
warning: method erasure in trait ClassManifestDeprecatedApis is deprecated: Use runtimeClass instead或者,您可以使用class标记:
def get[T](implicit tag : reflect.ClassTag[T] ) = {
LoggerFactory.getLogger( tag.runtimeClass.getName )
}与使用Manifest相比,这种替代方案更适合未来使用。Manifest将在2.10或更快的版本中被弃用。有关更多信息,请参阅this document的“类型标记和清单”部分。
发布于 2013-06-19 11:48:24
如果像我一样,您只对避免弃用警告感兴趣,那么您也可以使用manifest.runtimeClass.getName (而不是manifest.erasure.getName)。
即:
def classOp[T](implicit manifest: Manifest[T]) {
println("Class: " + manifest.runtimeClass.getName)
}我还发现了另一种我不完全理解的技术,可能有用,也可能没用……
def classOp[T <: Any : Manifest] {
println("Class: " + manifest[T].runtimeClass.getName)
}https://stackoverflow.com/questions/15490486
复制相似问题