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

Java 如何从int转换为泛型类型Integer?,java,android,generics,Java,Android,Generics,我对Java比较陌生,并且习惯于C#中的泛型,所以我对这段代码有点费劲。基本上,我需要一个通过键获取存储的Android首选项的通用方法,而这段代码虽然难看,但适用于布尔值,但不适用于整数,当它遇到ClassCastException时。谁能告诉我为什么这是错误的,也许可以帮助我改进整个例程(使用通配符?) 以下是getInt()的Android代码: 我尝试过各种方法-使用本机int,强制转换为整数,但没有任何效果。我可以建议: Integer i = new Integer(42); 尝试

我对Java比较陌生,并且习惯于C#中的泛型,所以我对这段代码有点费劲。基本上,我需要一个通过键获取存储的Android首选项的通用方法,而这段代码虽然难看,但适用于布尔值,但不适用于整数,当它遇到ClassCastException时。谁能告诉我为什么这是错误的,也许可以帮助我改进整个例程(使用通配符?)

以下是getInt()的Android代码:

我尝试过各种方法-使用本机int,强制转换为整数,但没有任何效果。

我可以建议:

Integer i = new Integer(42);

尝试定义一组具有相同名称的函数,这些函数的默认类型不同,然后让编译器计算出来。当使用类型,尤其是基本类型时,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; }
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;
}
如果无论存储的是什么,都试图获取特定类型(如int),则可以使用:

public function Object getPreference( String key , Object missing ) { return sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : missing; }
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;
}

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

除非我被您的问题和您需要完成的任务弄错了,否则如果输入是
int
,这应该行得通。抱歉,这行不通。这是我的原始代码。事实上,我将编辑示例以显示这一点。ThanksI更正了我的示例thanks并显示了正在调用的Android源代码。我假设您也尝试过:
returnnewinteger(sharedPreferences.getInt(prefKey,def))?我认为这就是泛型的全部内容:)如果可能的话,我宁愿使用泛型。但如果我不能,我会照你的建议去做。ThanksJava不像其他语言那样灵活,并且原语不是对象,因此它们不能混合使用返回类型或函数参数。您可以返回一个对象或一个特定的原语,如int或boolean,但它必须在编译时确定。谢谢-这很有用,但它仍然返回一个对象,不是吗?不是强类型对象。请注意,我已经解决了这个问题。见下面我的答案。首选项本身被存储为字符串,出错的是Android代码。谢谢您不能为该方法返回
整数
数据类型,可以吗?我的意思是,该方法的签名表示
int
而不是
Integer
…这就是为什么我说:“我尝试了各种方法-使用本机int,强制转换为整数,但都不起作用。”问题是map.get无法从ListPreference数组返回int,这就是我想要做的。API特别声明,如果您试图获取与
getType
方法对应的类型不同的首选项,则来自
SharedReferences
的所有
getType
方法都会抛出
ClassCastException
。没错。我的下一个问题是,如何拥有一个值为整数数组的ListPreference。
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;
}