2012-10-23 38 views
0

有一個問題只是讓我感到困惑。我有一個HashMap被聲明爲使用一個字符串作爲鍵和我自己的KWIKattribute作爲值。HashMap get(Object)總是返回字符串而不是其他對象

private HashMap<String, KWIKattribute> attributes = new HashMap<String, KWIKattribute>(); 

我把物品進去,其中sgml_xml_tag是一個字符串和kattr是KWIKattribute的一個實例。

attributes.put(sgml_xml_tag, kattr); 

當我試圖讓值回了作爲一個KWIKattribute

for (Map.Entry<String, KWIKattribute> e : attributes.entrySet()) { 
     String key = e.getKey(); 
     KWIKattribute kattr = (KWIKattribute) attributes.get(e.getKey()); 
} 

拋出一個異常

javax.faces.el.EvaluationException: java.lang.ClassCastException: java.lang.String cannot be cast to com.northgrum.adt.kwik.model.KWIKattribute 

我知道這可能是我的一個簡單的愚蠢錯誤的地方,但我沒有看到它是什麼。有什麼建議麼?

+4

你爲什麼不使用'e.getValue()'? – rptmat57

+0

是什麼版本的JSF?它實現了JSF'javax.faces.el.E​​valuationException'。您發佈的代碼與我認爲不相關。你能發佈堆棧跟蹤嗎? –

+0

真正的問題是爲什麼在調用'attributes.get()'之後需要投射?如果它正在做我們所有人的想法,那麼該方法無論如何應該返回'KWIKattribute'參考。是否有可能使用本地範圍中的另一個映射來隱藏「屬性」的聲明? –

回答

0

而不是

KWIKattribute kattr = (KWIKattribute) attributes.get(e.getKey()); 

使用

KWIKattribute kattr = e.getValue(); 

您遍歷條目集地圖。每個條目都包含一個鍵和與該鍵在地圖中相關聯的值。您可以直接從條目中獲取值;就像你在做的那樣,沒有必要在地圖上查看它。

這就是說,你得到這個錯誤很奇怪。首先,根本不需要投到KWIKattribute。其次,如果attributes確實是HashMap<String, KWIKattribute>,那麼存在String個對象作爲值是不可能的。

+0

「不可能性」是困擾我的東西。我從e.getValue()開始,它也返回一個String。如果我做Object obj = e.getValue(),那麼我打印Object的類,它是java.lang.String。 –

+0

如果您將演員移除到'KWIKattribute'會發生什麼?它仍然編譯,還是你得到一個錯誤?如果你得到一個錯誤,那麼'attributes'確實是'HashMap '還是別的? – Jesper

0

Map.Entry -class,您用於遍歷Map的入口集有一個getValue()-method,它將值返回給當前鍵。

否則,如果你只是從地圖中的值感興趣,你也可以遍歷values-collection

for (KWIKattribute attr : attributes.values()){ 
    // Do your work with attr 
} 
相關問題