我对Java比较陌生,并且习惯于C#中的泛型,因此在此代码方面有些挣扎。基本上,我想要一个通用的方法来通过键来获取存储的Android偏好设置,尽管该代码很丑陋,但当它抛出ClassCastException异常时,它适用于布尔值而不是整数。谁能告诉我为什么这是错误的,也许可以帮助我改善整个例程(使用通配符?)?
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,但是没有任何效果。
事实证明,我尝试读取的首选项存储为字符串,因此强制转换异常来自Android代码内部而不是我的内部。谢谢你的帮助。但是,由于我是Java新手,如果您认为我的例程普遍存在任何问题,请教我一个更好的方法。