1

Android コード - SharedPreferences クラスは、さまざまな設定を永続化/取得するためのさまざまなメソッドをエクスポートします。

@SuppressWarnings("unchecked")
public static <T> T retrieve(Context ctx, String key, T defaultValue) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    if (defaultValue instanceof Boolean) return (T) (Boolean) prefs
            .getBoolean(key, (Boolean) defaultValue);
    else if (defaultValue instanceof Float) return (T) (Float) prefs
            .getFloat(key, (Float) defaultValue);
    // etc - another 4 cases
}

これは機能し、問題なく呼び出すことができますboolean stored = retrieve(ctx, "BOOLEAN_KEY", true)-しかし、私の質問は:私はすでに使用instanceofTていて、特定のクラスに要約したので、シングルキャストとダブルキャストを回避する方法はありwarning : uncheckedますか?

編集:クラスを渡す場合は、呼び出しgetBoolean()などgetFloat()を行うこともできます。メソッドの内部を簡素化し、警告を取り除きますが、呼び出しretrieve(ctx, "KEY", 1 or "string" or true)て必要なものを取得できるようにする必要があります。

4

3 に答える 3

2

通常の方法は Class.cast(obj) を使用することですが、T クラスのインスタンスが必要になります。これは通常、メソッドに渡すことによって行われますが、あなたの場合は問題ありません。

return Boolean.class.cast(pregs.getBoolean(key, (Boolean)defaultValue));

編集:コメントの後、はい、タイプの不一致に問題がある可能性があります。

メソッドの一部としてクラス型を渡すか、デフォルト値から推論する必要があります (null でない場合:

return defaultValue.getClass().cast(pregs.getBoolean(key, (Boolean)defaultValue));

実際の例で再度編集します(これは警告なしで機能します):

public class JunkA {

    private boolean getBoolean(String key, boolean def) {
        return def;
    }

    private float getFloat(String key, float def) {
        return def;
    }

    private String getString(String key, String def) {
        return def;
    }

    private int getInt(String key, int def) {
        return def;
    }

    public <T> T getProperty(final Class<T> clazz, final String key,
            final T defval) {
        if (clazz.isAssignableFrom(Boolean.class)) {
            return clazz.cast(getBoolean(key, (Boolean) defval));
        }
        if (clazz.isAssignableFrom(String.class)) {
            return clazz.cast(getString(key, (String) defval));
        }
        if (clazz.isAssignableFrom(Boolean.class)) {
            return clazz.cast(getFloat(key, (Float) defval));
        }
        if (clazz.isAssignableFrom(Integer.class)) {
            return clazz.cast(getInt(key, (Integer) defval));
        }
        return defval;
    }

}
于 2013-04-30T16:28:31.940 に答える
0

さて私の質問(単純に)だった:私はすでにinstanceofを使用していて、Tは特定のクラスに煮詰められているので、シングルキャストとダブルキャストと警告を回避する方法はありますか:チェックされていませんか?

そして答えはノーです - 私は疑問に思ったのは私だけではないことを示しているので、この特定の答えを引用しています. しかし、@yshavit によるトピックの回答とは少し異なりますが、興味深いものに投票することをお勧めします :)

于 2013-07-18T23:26:56.837 に答える