Вот фундаментальная проблема с тем, что вы хотите:
def get(key: String): Option[T] = ...
val r = map.get("key")
Тип r
будет определен из возвращаемого типа get
- так, каким должен быть этот тип?Откуда это можно определить?Если вы сделаете его параметром типа, то это будет относительно просто:
import scala.collection.mutable.{Map => MMap}
val map: MMap[String, (Manifest[_], Any) = MMap.empty
def get[T : Manifest](key: String): Option[T] = map.get(key).filter(_._1 <:< manifest[T]).map(_._2.asInstanceOf[T])
def put[T : Manifest](key: String, obj: T) = map(key) = manifest[T] -> obj
Пример:
scala> put("abc", 2)
scala> put("def", true)
scala> get[Boolean]("abc")
res2: Option[Boolean] = None
scala> get[Int]("abc")
res3: Option[Int] = Some(2)
Проблема, конечно, в том, что вы должны сообщить компилятору, какой тип вы используете.ожидать, что будет храниться на карте под этим ключом.К сожалению, этого просто нет: компилятор не может знать, какой тип будет храниться под этим ключом во время компиляции.
Любое решение, которое вы примете, приведет к той же самой проблеме: так или иначе,вам нужно будет указать компилятору, какой тип должен быть возвращен.
Теперь это не должно быть бременем в программе Scala.Возьмите r
выше ... затем вы будете использовать r
для чего-то, верно?То, для чего вы его используете, будет иметь методы, соответствующие какому-то типу, и, поскольку вы знаете, что это за методы, вы должны также знать, каким должен быть тип r
.
Если это не такв этом случае что-то в корне не так с кодом - или, возможно, вы не захотели получить карту, чтобы знать, что вы будете с ней делать.