我有一個完整的stumper,並將其提供給所有人,看看你是否知道發生了什麼事情。未能強制在Java通用類型
這是數據結構
Map<String, Object> objectMap
它存儲字符串和數值現在,但可能在未來存儲更多類型。
這是我用來檢索這些值的函數:
public <T> T get(String variable, T defaultValue) {
// returns either the object from the map, or the default if its not in the map.
Object value = getObject(variable, defaultValue);
logger.debug("default value is of type " + defaultValue.getClass().getName());
// Attempt to get around casting issue
if (value instanceof Number)
{
value = (Number) value;
}
T ret = (T) value;
logger.debug("Variable " + variable + " which is of type " + value.getClass().getName() + " and returning as " + ret.getClass().getName() + " (is number: " + (value instanceof Number) + ")");
return ret;
}
這是調用代碼:
public int getFoo() { return this.<Integer>get("foo", 0); }
這是輸出我在日誌中看到:
default value is of type java.lang.Integer
Variable foo which is of type java.lang.Long and returning as java.lang.Long (is number: true)
就在它失敗之前:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
這裏最讓我擔心的是類的類型看起來很長,儘管試圖強制類使用Integer。
我錯過了什麼,或者違反了Java泛型的一些概念?
感謝所有幫助
對於初學者,你真的不應該使用'Map'。地圖應該有一個單一的,具體的價值類型,它真的是有代碼的臭混合在一起。 –
2012-03-05 08:14:02
請發送更多堆棧跟蹤,發生此異常? – MJM 2012-03-05 08:18:40
對地圖的看法是什麼? – 2012-03-05 08:19:21