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

我对Java比较陌生,习惯于在C#中使用generics,所以我对这段代码有点挣扎。 基本上我想要一个通过键获取存储的Android首选项的通用方法,这个代码虽然很丑,但是当它被ClassCastException爆炸时,它适用于布尔但不适用于整数。 任何人都可以告诉我为什么这是错误的,也许可以帮助我改善整个例程(使用通配符?)?

public static  T getPreference(Class 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,但没有任何效果。

我可以建议:

 Integer i = new Integer(42); 

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

尝试定义一组具有相同名称的函数,这些函数采用不同的默认类型,让编译器弄清楚它。 在处理类型(尤其是原始类型)时,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; }