我對Java相對比較陌生,習慣於C#中的泛型,所以用這段代碼掙扎了一下。基本上我需要一個通用的方法來獲取存儲Android偏好的鍵,而這個代碼雖然很醜,但它適用於布爾型而不是整型,當它拋出ClassCastException時。誰能告訴我爲什麼這是錯誤的,也許幫助我改進整個例程(使用通配符?)?如何從int轉換爲泛型類型Integer?
public static <T> T getPreference(Class<T> argType, String prefKey, T defaultValue,
SharedPreferences sharedPreferences) {
...
try {
if (argType == Boolean.class) {
Boolean def = (Boolean) defaultValue;
return argType.cast(sharedPreferences.getBoolean(prefKey, def));
} else if (argType == Integer.class) {
Integer def = (Integer) defaultValue;
return argType.cast(new Integer(sharedPreferences.getInt(prefKey, def)));
} else {
AppGlobal.logWarning("getPreference: Unknown type '%s' for preference '%s'. Returning default value.",
argType.getName(), prefKey);
return defaultValue;
}
} catch (ClassCastException e) {
AppGlobal.logError("Cast exception when reading pref %s. Using default value.", prefKey);
return defaultValue;
}
}
我調用的代碼是:
mAccuracy = GlobalPreferences.getPreference(Integer.class, prefKey, mAccuracy, sharedPreferences);
這裏是getInt()Android的代碼:
public int getInt(String key, int defValue) {
synchronized (this) {
Integer v = (Integer)mMap.get(key);
return v != null ? v : defValue;
}
}
我已經試過各種方法 - 使用本地INT,鑄造一個Integer,但沒有用。
'mAccuracy'是什麼類型? – JRL 2010-04-24 16:38:44
請注意,我已經解決了這個問題。請參閱下面的答案。首選項本身是以字符串的形式存儲的,它是錯誤的Android代碼。謝謝 – 2010-04-24 16:41:57
你不能爲這個方法返回一個'Integer'數據類型,對嗎?我的意思是,該方法的簽名表示「int」,而不是「整數」.... – Nitrodist 2010-06-09 20:46:18