2013-12-12 139 views
1

我該如何減少這一點在java中用於Android的反射幾行?使用反射來投射一個對象在java中爲Android

_properties是ContentValues對象和是一個對象)

if (value instanceof String) 
    { 
     this._properties.put( key, value.toString()); 
    } else if (value instanceof Long) { 
     this._properties.put( key, Long.valueOf(value.toString())); 
    } else if (value instanceof Integer) { 
     this._properties.put( key, Integer.valueOf(value.toString())); 
    } else if (value instanceof Boolean) { 
     this._properties.put( key, Boolean.valueOf(value.toString())); 
    } else if (value instanceof Byte) { 
     this._properties.put( key, Byte.valueOf(value.toString())); 
    } else ... 
+0

我不是Android開發人員,所以我爲我的無知感到抱歉,但爲什麼你甚至檢查'value'類型? 'this._properties.put(key,value)是否有問題;'? – Pshemo

+2

@Pshemo'ContentValues'沒有一個通用的'put object'方法,只有某些類型的類型化方法(因爲內部序列化/ parcel):http://developer.android.com/reference/android/content/ContentValues .html當使用這些時,最好是轉換而不是轉換爲一個字符串,但這會減少只需稍微使用的代碼(例如'this._properties.put(key,(Byte)value)')。 –

+0

'this._properties.put(key,(Byte)value))'與this._properties.put(key,Byte.valueOf(value.toString()))'是一樣的,對吧? – spacebiker

回答

2

無反射需要:

_properties.put(key, value.toString()); 

不幸的是ContentValues沒有put(String, Object)即使在內部的值是存儲在HashMap<String, Object>

爲什麼存儲值String作品是所有ContentValuesgetAsFoo()存取支持從String轉換爲Foo

+0

所以你的意思是我可以使用value.toString()來存儲該值,並在以後繼續使用instanceOf ..? '(_properties instanceOf [whatever_type_here])' – spacebiker

+0

這些值將被存儲爲'String's,因此如果使用通用的get():Object'來訪問類型信息,則會丟失類型信息。但'getAs ...()'訪問器會嘗試在放棄之前將'String'轉換爲請求的類型。 – laalto

+1

儘管這是一種可行的方法,但它與原始代碼不同,因爲您會丟失該類型。對於無法無損序列化爲字符串的類型,在反序列化('Float','Double')之後,該值可能會稍有不同。在大多數情況下,這些問題是微不足道的 - 你不會處理任意數據,所以你知道與某些鍵相關的類型,我猜從現在開始,沒有太多的應用需要完全精確的(除了初學者代碼比較用== ==浮點值)。另一方面,您只需寫一次原始代碼(通過投射)。 –