[英]Generic use of Enum.valueOf
我试图将对枚举的保存普遍化为首选项。
要保存一个枚举,我可以使用:
public static <T extends Enum<T>> void savePreference(final Context context, final String id, final T value) {
SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(id, value.name());
editor.apply();
}
我正在尝试执行以下操作,这将允许我将首选项读入通用枚举:
public static <T extends Enum<T>> T getPreference(final Context context, final String id, final T defaultValue) {
try {
SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
String name = settings.getString(id, null);
return name != null ? Enum.valueOf(T, name) : defaultValue;
} catch (Exception e) {
Log.e("ERROR GETTING", e.toString());
return defaultValue;
}
}
但这给了我错误:
Error:(93, 48) error: cannot find symbol variable T
在“ Enum.valueOf(T,name)”表达式上。
我也尝试过使用T.valueOf(name)
但是会产生参数不匹配错误。
我已经能够通过不使用泛型和对特定实现进行编码来解决此问题,但这种方法无法达到目的:
public static Constants.ButtonLocations getPreference(final Context context, final String id, final Constants.ButtonLocations defaultValue) {
try {
SharedPreferences settings = context.getSharedPreferences(SESSION_TOKEN, Context.MODE_PRIVATE);
String name = settings.getString(id, null);
return name != null ? Constants.ButtonLocations.valueOf(name) : defaultValue;
} catch (Exception e) {
Log.e("ERROR GETTING", e.toString());
return defaultValue;
}
}
如何创建getPreference的通用版本?
您可以将Class<T>
参数添加到您的方法中
public static <T extends Enum<T>> T getPreference(final Context context, final String id, final Class<T> clazz, final T defaultValue)
那你可以用
Enum.valueOf(clazz, name)
另外,如果defaultValue
永远不会为null
,则可以摆脱此额外的参数,并使用此默认值获取类。
Enum.valueOf(defaultValue.getDeclaringClass(), name)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.