泛型类型作为参数

时间:2014-10-27 10:30:48

标签: java android generics

以下代码是我用来更新数据库中某些字段值的代码

public void updatesomeField(String registrationID) {
    ContentValues objValues;

    try {
        objDatabase=this.getWritableDatabase();
        objValues = new ContentValues();


        objValues.put(COLUMN_REGISTRATION_ID,registrationID);
        objDatabase.update(CUSTOMER_USERS_TABLE_NAME, objValues,null,null);
        objDatabase.close();
    } catch(Exception errorException) {
        Log.d("error",""+ errorException);
    }
}

然后我决定使用通用方法,因此编写了上面的代码,如

public <T> void update(String tableName, String columnName, T value) {
    ContentValues objValues;

    try {
        objDatabase=this.getWritableDatabase();
        objValues = new ContentValues();

        objValues.put(columnName,value);  ///here comes the error BECAUSE THE 'value'
        objDatabase.update(tableName, objValues,null,null);
        objDatabase.close();
    } catch(Exception errorException) {
        Log.d("error",""+ errorException);
    }
}

错误是因为ContentValuesfinal而我无法扩展它以创建我自己的新类来存储我的通用变量类型。应该执行哪些优化,以便通过使用相同的代码来消除错误?


同一问题的另一个版本(如果上述问题很难理解)

我有一个最终的预定义类ContentValues,其方法是以键和值的形式获取参数。


enter image description here


但是我想实现一个通用的功能,并希望在运行时决定它应该是什么类型的值

3 个答案:

答案 0 :(得分:1)

你可以写一个Adapter为你做调度:

class ContentValuesAdapter {

    private ContentValues values;

    public ContentValuesAdapter(ContentValues values) {
        this.values = values;
    }

    public void put(String columnName, Object value) {
        if(value instanceof String) {
            values.put(columnName, (String) value);
        } else if ( ... ) {
            ...
        }
    }

    public ContentValues getContentValues() {
        return this.values;
    }

    /* Delegate all other methods to the ContentValue instance. */
}

现在您可以使用此类而不是原始类,并保持使用代码清洁。

答案 1 :(得分:1)

我在整个应用程序中使用泛型类型,并且必须说确定对象类型的最简单(可能不是最好或最有效)方法之一是instanceof - 例如:

if(obj instanceof SiteContact){
    buildContactDropdownList((SiteContact)obj);
}else if(obj instanceof Delivery){
    buildDeliveryList((Delivery)obj);
}

你也可以很容易地把它包装在帮助器类中。

答案 2 :(得分:0)

如果ContentValues类属于第三方库并且您无法访问其源代码,那么我担心您会坚持使用它。

显然,ContentValues包含put(String,String)方法。您可以做的是调用toString()的{​​{1}}方法:

value

由于objValues.put(columnName, value.toString()); 方法已经在班级toString()中定义,因此您不需要使用泛型。所以你可以打电话给你的方法:

Object