我有以下代码:
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
。我现在应该使用什么来实现相同的功能?
答案 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)
}