2014-01-10 146 views
0

亞型我有一張地圖,聲明如下:鑄造斯卡拉

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 
} 

不過,我得到一個類型不匹配異常解釋說,我們期待A類_ <:ICacheable],但實際是類[任何]

我需要做什麼才能正確投射這些東西?

回答

6

您可以放心地使用模式匹配:

message match { 
    case iCacheable: ICacheable => iCacheMap.get(iCacheable.getClass).getOrElse("Not Found in Map") 
    case _ => //manage the "else" case 
} 

,當你有,你想了解信息的靜態類型classOf [T]是有用的;如果您需要從實例中檢索相同的信息,則可以使用getClass。

+0

不知道我遵循,在我上面的例子中的編譯錯誤是爲classOf [iCacheable。你能展示上述答案如何解決這個問題嗎?謝謝 – DJ180

+0

我改進了這個例子。你必須使用getClass。 – Marco

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") 
}