8

私は次のコードを持っています:

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は非推奨であると言っています。これと同じ機能のために今何を使うべきですか?

4

2 に答える 2

10

最も簡単な修正は、 への呼び出しを への呼び出しに置き換えるerasureことruntimeClassです。で実行すると-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ます。 Manifest2.10.something またはその直後に非推奨になる予定です。詳細については、このドキュメントの「タイプ タグとマニフェスト」セクションを参照してください。

于 2013-03-19T02:36:10.917 に答える
3

私のように、非推奨の警告を回避することのみに関心がある場合は、(manifest.erasure.getName の代わりに) manifest.runtimeClass.getName を使用することもできます。

いいえ:

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

また、完全には理解できず、役立つ場合とそうでない場合がある別の手法を見つけました...

def classOp[T <: Any : Manifest] {
  println("Class: " + manifest[T].runtimeClass.getName)
}
于 2013-06-19T03:48:24.180 に答える