我所说的字典是指从名称到值的轻量级映射,可以用作方法的返回值。
我知道的选项包括创建案例类、创建匿名对象以及从字符串 -> 任何创建映射。
- 案例类需要精神开销来创建(名称),但它是强类型的。
- Anon 对象似乎没有很好的文档记录,而且我不清楚如何将它们用作参数,因为没有命名类型。
- Maps from String -> Any require casting for retrieval.
还有更好的吗?
理想情况下,这些可以从 json 构建并在适当的时候转换回它。
我不需要静态类型(虽然它会很好,但我知道这是不可能的)- 但我确实想避免显式转换。
最佳答案
这是您想要的基本问题:
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)
当然,问题在于您必须告诉编译器您希望在该键下的 map 上存储什么类型。不幸的是,根本没有办法解决这个问题:编译器无法知道在编译时该键下将存储什么类型。
您采用的任何解决方案最终都会遇到同样的问题:不知何故,您必须告诉编译器应该返回什么类型。
现在,这不应该成为 Scala 程序的负担。以上面的 r
为例...然后您将使用 r
做某事,对吧?你正在使用它的东西将有适合某种类型的方法,既然你知道这些方法是什么,那么你也必须知道 r
的类型必须是什么。
如果不是这种情况,则说明代码存在根本性错误——或者,也许您还没有从想要 map 发展到知道要用它做什么。
关于scala - 在 Scala 中创建和传递包含多种类型的字典的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918419/