我想创建一个哈希表来存储参数名称及其值。但是,这些参数具有不同的类型。我可以使用HashMap [String,Any],但以后不知道它们是哪种类型。无论如何,我可以恢复类型信息吗?还是有更好的方法来存储配对?

最佳答案

您要访问静态类型信息还是动态类型信息?如果您希望使用前者,则可以使用键入的键。遵循这些原则的东西应该起作用:

final class Key[T]

object Registry {
   private var backingMap: Map[Key[_], _] = Map.empty

   def put[T](k: Key[T], v: T) = backingMap += (k -> v)

   def get[T](k: Key[T]): Option[T] = backingMap get k map (_.asInstanceOf[T])
}

scala> val strKey = new Key[String]
strKey: Key[String] = Key@31028a

scala> val intKey = new Key[Int]
intKey: Key[Int] = Key@7ae77ca4

scala> Registry.put(strKey, "asdf")

scala> Registry.get(strKey)
res0: Option[String] = Some(asdf)

scala> Registry.put(intKey, "asdf")
<console>:10: error: type mismatch;
 found   : Key[Int]
 required: Key[Any]
       Registry.put(intKey, "asdf")

或者,您可以使用未键入的键,并使用 list (如Daniel suggested)将类型信息存储在Map中:
class Registry[K] {
   import scala.reflect.Manifest

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

   def put[T](key: K, item: T)(implicit m: Manifest[T]) {
      _map += (key -> (m, item))
   }

   def get[T](key:K)(implicit m : Manifest[T]): Option[T] = {
      for ((om, v) <- _map get key if om <:< m)
         yield v.asInstanceOf[T]
   }
}

后一种方法的优点是您可以使用任何东西作为键,而不必传递原始的键入键对象。但是,这样做的缺点是,在调用get方法时必须指定值类型。如果您指定了错误的类型,您将得到None,就像该键根本不在注册表中一样,而使用键入的键,则可以确保获取与该键关联的任何值。

关于reflection - 斯卡拉反射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4309835/

10-10 01:50