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