Java 如何将对象强制转换为仅在运行时已知的类型?

Java 如何将对象强制转换为仅在运行时已知的类型?,java,casting,Java,Casting,我正在尝试在运行时按类型向对象进行强制转换,但它不能以这种方式工作。 有一些聪明的方法可以做到这一点,而不是对所有选项使用instanceOf() public <T> void updateUser(final SQLiteDatabase db, final String key, Class<T> cls, Object newVal, String prevVal){ ContentValues userValue = new ContentValues()

我正在尝试在运行时按类型向对象进行强制转换,但它不能以这种方式工作。 有一些聪明的方法可以做到这一点,而不是对所有选项使用
instanceOf()

public <T> void updateUser(final SQLiteDatabase db, final String key, Class<T> cls, Object newVal, String prevVal){
   ContentValues userValue = new ContentValues();
    try {
        userValue.put(key, cls.cast(newVal));
    } catch(ClassCastException e) {
    }
    db.update(mDBName, userValue, key + " = ?", new String[] {prevVal});
}
public void updateUser(最终SQLiteDatabase db、最终字符串键、类cls、对象newVal、字符串prevVal){
ContentValues userValue=新ContentValues();
试一试{
userValue.put(key,cls.cast(newVal));
}catch(ClassCastException e){
}
update(mDBName,userValue,key+“=?”,新字符串[]{prevVal});
}

您显示(使用)的方法确实有效,但有处理异常的开销

一种更清晰、更简洁的方法是使用以下方法:

public void updateUser(最终SQLiteDatabase db、最终字符串键、类cls、对象newVal、字符串prevVal){
ContentValues userValue=新ContentValues();
if(cls.isInstance(新值)){
//只有当“userValue”的值类型为T时,才需要cls.cast
//比如“MapUserValue”;如果是“Map”,那么
//你可以不用演员阵容直接使用“newVal”。
userValue.put(key,cls.cast(newVal));
//您需要在“if”-块中包含“db.update”,
//因为您需要更新至少一个字段以使其成为
//有效的SQL语句。
update(mDBName,userValue,key+“=?”,新字符串[]{prevVal});
}否则{
//引起某种错误或记录一些东西?
}
}

没有,我已经试过了@AzureFrogyYou知道强制转换对象不会改变任何东西,它只是告诉编译器给定的实例是该类型的(但实例没有改变,例如,如果它是
字符串
,那么它仍然是
字符串
的(实例),无论它被强制转换成什么类型){通过强制转换改变原语}有没有理由不直接编写
userValue.put(key,newVal)
?因为我从“put”中得到一个错误:“无法解析方法”put(java.lang.String,Object)@nirkov它也不起作用。我从“put”中得到一个错误:“无法解析方法”put(java.lang.String,t)”
public <T> void updateUser(final SQLiteDatabase db, final String key, Class<T> cls, Object newVal, String prevVal){
    ContentValues userValue = new ContentValues();
    if (cls.isInstance(newVal)) {
        // cls.cast is only necessary if `userValue` has a value type of T
        // like "Map<String, T> userValue"; if it's "Map<String, Object>" then
        // you can just use "newVal" without the cast.
        userValue.put(key, cls.cast(newVal));
        // You'll want to include "db.update" in the "if"-block,
        // since you need to update at least one field to make it a 
        // valid SQL statement.
        db.update(mDBName, userValue, key + " = ?", new String[] {prevVal});
    } else {
        // Raise some kind of error or log something?
    }
}