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)
}