4

我的 android 应用程序中有一个函数:

public static <T> void saveLocalData(Context context, String key, Class<T> value) {
    // Check type of value here
    SharedPreferences prefs = context.getSharedPreferences(
            Constants.PREFERENCES_KEY, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    if(value.isAssignableFrom(String.class)){
        //Put value here
    }
    else if(value.isAssignableFrom(Boolean.class)){
        //Put value here            
    }

    editor.commit();
}

我想检查这个函数中值的类型(我想检查两个类型BooleanString),但我不知道该怎么做!任何人都可以提出任何建议吗?谢谢!

编辑:谢谢大家的帮助!我还有一个问题是如何将它的价值保存到Preferences

4

2 回答 2

5

你可以使用Class.isAssignableFrom().

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口


更新:通过问题中的编辑,为了在 a 中设置键/值SharedPreferences.Editor,使用putString()and putBoolean()

考虑到您需要将值作为参数接收。请注意,如果您收到该值,您已经可以访问它的类(因此您不需要Class<T>作为参数也不需要isAssignableFrom()),并通过instanceof运算符检查它:

public static <T> void saveLocalData(Context context, String key, T value) {
    SharedPreferences prefs = context.getSharedPreferences(
        Constants.PREFERENCES_KEY, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    if (value instanceof String) { 
        editor.putString(key, (String) value);
    }
    else if (value instanceof Boolean){
        editor.putBoolean(key, (Boolean) value);
    }
    editor.commit();
}
于 2012-09-13T09:13:11.350 回答
1

我没有在 Android 上尝试过,但由于它的语法通常等同于 Java,因此在 Java 中可以使用以下两种方法:

if (Boolean.class.equals(value) || String.class.equals(value)) {
    // Do stuff.
}

这是有效的,因为BooleanString都是最终的,您不必担心扩展类。我认为您甚至可以==在这种情况下使用(假设是正常的),因为类路径上ClassLoader通常只有一个Classper实例。Class如果您需要担心扩展类,请使用:

if (Boolean.class.isAssignableFrom(value) || String.class.isAssignableFrom(value)) {
    // Do stuff.
}
于 2012-09-13T09:18:28.337 回答