在Scala中转换为子类型

时间:2014-01-10 23:15:48

标签: scala

我的地图声明如下:

private var iCacheMap: HashMap[Class[_ <: ICacheable], String] = ....

因此,此iCacheMap的关键是实现ICacheable接口的类

然后我想查询这张地图,如下所示:

private def queryICacheMap(message: AnyRef) {
    val iCacheable = message.asInstanceOf[ICacheable] 
    val myString = iCacheMap.get(classOf[iCacheable]).get
    // ...do something with myString
}

但是,我得到一个类型不匹配异常,说明我们期望一个类[_&lt;:ICacheable],但实际是Class [Any]

我需要做什么才能正确投射?

2 个答案:

答案 0 :(得分:6)

您可以安全地使用模式匹配:

message match {
  case iCacheable: ICacheable => iCacheMap.get(iCacheable.getClass).getOrElse("Not Found in Map")
  case _ => //manage the "else" case
}
当你有一个想要了解信息的静态类型时,

classOf [T]很有用;如果您需要从实例中检索相同的信息,可以使用getClass。

答案 1 :(得分:0)

试试这个:

var iCacheMap: Map[Class[_ <: ICacheable], String] = Map()
//populate iCacheMap; message comes along
myString = message match {
  case iCacheable: ICacheable => iCacheMap.getOrElse(iCacheable.getClass, "Nothing")
  case _ => throw new IllegalArgumentException("Not good")
}