簡體   English   中英

Enum.valueOf的通用用法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM