2013-03-19 96 views
7

我有以下代码:Manifest [T] .erasure在2.10中已弃用,现在应该使用什么?

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

不熟悉使用这些工具的自己,但我相信你想看到的是TypeTag。 – adelbertc 2013-03-19 02:31:38

回答

9

最简单的方法是用runtimeClass的呼叫替换对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) 
} 

这种替代比使用Manifest更长远的保障。 Manifest在2.10.something或之后不久将被弃用。请参阅this document的“类型标签和清单”部分了解更多信息。

+0

太棒了,谢谢! – 2013-03-19 02:48:47

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) 
} 
相关问题