1

別の投稿の例を試してみました: Scala で型消去を回避するにはどうすればよいですか? または、コレクションの型パラメーターを取得できないのはなぜですか? . 以下は実行可能な例です。

object Registry {
   import scala.reflect.Manifest

   private var map = Map.empty[Any, (Manifest[_], Any)]

   def register[T](name: Any, item: T)(implicit m: Manifest[T]) {
      map = map.updated(name, m -> item)
   }

   def get[T](key: Any)(implicit m: Manifest[T]): Option[T] = {
     map get key flatMap {
      case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else None
   }
  }
}

object App extends App {
   Registry.register("a", List(1, 2, 3))

   println(Registry.get[List[Int]]("a"))
   //Some(List(1, 2, 3))
  }

2 つの質問があります。

  1. 1 つの暗黙のパラメータ m: Manifest[T] がメソッド レジスタにあり、このパラメータはどこかで使用するように定義する必要があると思います。でも定義がないのになんで使えるの?
  2. この行:case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else Noneメソッドget内の とはどういうom <:< m意味ですか? こういう使い方は初めて見ました。
4

1 に答える 1

1
  1. マニフェスト暗黙は、コンパイラによって挿入されます (コンパイラが生成できる場合)。
  2. om <:< momマニフェストで表される型がマニフェストで表される型のサブタイプであることを確認しmます。

ノート:

  • マニフェストは Scala 2.10 で TypeTags に置き換えられました
  • マニフェストの<:<メソッドは常に正確であるとは限りません (たとえば、型パラメーター、IIRC の共分散/反分散アノテーションを無視する可能性があります)。
于 2013-01-29T10:12:59.097 に答える