我对Java相对比较陌生,习惯于C#中的泛型,所以用这段代码挣扎了一下。基本上我需要一个通用的方法来获取存储Android偏好的键,而这个代码虽然很丑,但它适用于布尔型而不是整型,当它抛出ClassCastException时。谁能告诉我为什么这是错误的,也许帮助我改进整个例程(使用通配符?)?如何从int转换为泛型类型Integer?
public static T getPreference(Class 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,但没有用。
2010-04-24
Rob Kent
+0
'mAccuracy'是什么类型? –
2010-04-24 16:38:44
+0
请注意,我已经解决了这个问题。请参阅下面的答案。首选项本身是以字符串的形式存储的,它是错误的Android代码。谢谢 –
2010-04-24 16:41:57
+0
你不能为这个方法返回一个'Integer'数据类型,对吗?我的意思是,该方法的签名表示“int”,而不是“整数”.... –
2010-06-09 20:46:18