Reflection 斯卡拉反射

Reflection 斯卡拉反射,reflection,scala,hashmap,Reflection,Scala,Hashmap,我想创建一个hashmap来存储参数名及其值。但是,参数的类型不同。我可以使用HashMap[String,Any],但我不知道它们以后是什么类型。我是否可以恢复类型信息?还是有更好的方法来存储对?您想要访问静态类型信息还是动态类型信息?如果你想要前者,你可以使用键入的键。按照这些思路应该可以做到: final class Key[T] object Registry { private var backingMap: Map[Key[_], _] = Map.empty def

我想创建一个hashmap来存储参数名及其值。但是,参数的类型不同。我可以使用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")
final class Key[T]
对象注册表{
私有变量backingMap:Map[Key[\u],\ u]=Map.empty
def put[T](k:Key[T],v:T)=backingMap+=(k->v)
def get[T](k:Key[T]):选项[T]=backingMap get k map(u.asInstanceOf[T])
}
scala>val strKey=新键[字符串]
strKey:键[字符串]=Key@31028a
scala>val intKey=新键[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”)
:10:错误:类型不匹配;
找到:键[Int]
必需:键[任何]
Registry.put(intKey,“asdf”)
或者,您可以使用非类型化键,并使用清单(如下所示)在映射中存储类型信息:

类注册表[K]{
导入scala.reflect.Manifest
private var\u map=map.empty[K,(Manifest[\u],Any)]
def put[T](键:K,项:T)(隐式m:Manifest[T]){
_地图+=(键->(m,项目))
}
def get[T](键:K)(隐式m:Manifest[T]):选项[T]={

对于((om,v)

如果你没有太多的值,你可以考虑使用一对或类似的结构。

看,它精确地实现了你所要求的。< / P>这些副本中的任何一个都对你有用吗?如果没有,你有什么反馈能帮助我们更好地针对你的要求吗?好吧,没有一个真正解决了我的问题。被告知(离线)有些人认为没有优雅的解决方案。我后来更改了设计以避免出现这样的问题……那么使用Daniel的解决方案,并更改

get
以返回一对键的值和值的清单呢?很好!我在回答中稍微简化了您的实现,并试图解释键入的键之间的差异方法和存储清单方法。
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]
   }
}