如何从int转换为泛型类型Integer?

时间:2010-04-24 15:53:58

标签: java android generics

我对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;
        }
    }

我尝试了各种方法 - 使用native int,强制转换为Integer,但没有任何效果。

3 个答案:

答案 0 :(得分:0)

我可以建议:

Integer i = new Integer(42);

答案 1 :(得分:0)

尝试定义一组具有相同名称的函数,这些函数采用不同的默认类型,让编译器弄清楚它。在处理类型时,Java真的会牵手,特别是原始类型。

public function int getPreference( String key , int missing ) { return sharedPreferences.getInt( key , missing ); }
public function boolean getPreference( String key , boolean missing ) { return sharedPreferences.getBoolean( key , missing ); }
public function String getPreference( String key , String missing ) { return sharedPreferences.getString( key , missing ); }

编辑:

如果您尝试获取对象(不是原始对象),无论其类型如何,您都可以使用:

public function Object getPreference( String key , Object missing ) { return sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : missing; }

如果您尝试获取类似int的特定类型而不管存储的内容,您可以使用:

public function int getPreference( String key , int missing ) {
    int result = missing;
    Object value = sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : null;
    if ( value instanceof Integer ) result = ((Integer)value).intValue();
    if ( value instanceof Boolean ) result = ((Boolean)value).booleanValue() ? 1 : 0;
    // repeat for every other primitive wrapper type you care about
    return result;
}

如果您尝试仅在特定类型的情况下获得结果,则可以使用以下内容:

public function Object getPreference( Class inRequire , String key , Object missing ) {
    Object value = sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : null;
    if ( !( value instanceof inRequire ) ) {
        value = null;
    }
    return ( value == null ) ? missing : value;
}

答案 2 :(得分:0)

事实证明我试图读取的首选项存储为字符串,因此强制转换异常来自Android代码而非我的。谢谢你的帮助。但由于我是一个Java新手,如果你认为我的日常工作有任何问题,请教我一个更好的方法。