使用反射在java for android中强制转换对象
我如何使用java for android中的反射将这一点减少到几行呢 (\u properties是一个ContentValues对象,value是一个对象) 无需思考:使用反射在java for android中强制转换对象,java,android,reflection,Java,Android,Reflection,我如何使用java for android中的反射将这一点减少到几行呢 (\u properties是一个ContentValues对象,value是一个对象) 无需思考: _properties.put(key, value.toString()); 不幸的是,ContentValues没有put(String,Object),即使这些值在内部存储在HashMap中 将值存储为String的原因是所有ContentValuesgetAsFoo()访问器都支持从String转换为Foo,我不
_properties.put(key, value.toString());
不幸的是,ContentValues
没有put(String,Object)
,即使这些值在内部存储在HashMap
中
将值存储为
String
的原因是所有ContentValues
getAsFoo()
访问器都支持从String
转换为Foo
,我不是安卓开发者,所以很抱歉我的无知,但为什么你还要检查值的类型呢?这个有问题吗?\u properties.put(key,value)
?@PshemoContentValues
没有通用的put对象
方法,只有特定类型的类型化方法(因为内部序列化/打包):使用这些方法时,最好是强制转换,而不是转换为字符串,但这只会稍微减少所需的代码(例如this.\u properties.put)(key,(Byte)value)
。这个。(u properties.put(key,(Byte)value))
和这个是一样的。(u properties.put(key,Byte.valueOf(value.toString())
,对吗?@谢谢你的澄清,现在它更有意义了。主要问题是引用OP使用的是Object
类型,比如Object value=giveMeYourMoney()
,应该与正确的put
方法一起使用,因为没有通用的put(String,Object)
方法可以消除歧义。@Xabier否,即使这种情况下的结果相同,但程序不同。使用toString/valueOf
将值转换为字符串,然后再转换回原始值。由于valueOf
的返回类型,编译器知道要使用哪个put
方法,但转换本身并没有起到有效的作用。通过强制转换,您可以直接告诉编译器使用哪种方法。关键字是“early binding”。你的意思是我可以使用value.toString()来存储值,但以后仍然使用instanceOf(\u properties instanceOf[which\u type\u here])
值将存储为字符串
s,因此如果使用泛型get():对象
进行访问,类型信息将丢失。但是getAs…()
访问器在放弃之前会尝试将String
s转换为请求的类型。虽然这是一种可行的方法,但在丢失类型时它与原始代码不同。对于无法序列化为字符串而不丢失的类型,反序列化后的值可能略有不同(Float
,Double
)。在大多数情况下,这些问题都是无关紧要的-您不处理任意数据,因此您知道与某些键相关联的类型,我猜到目前为止,没有多少应用程序需要全精度(除了比较浮点值与=
的初学者代码)。另一方面,您只需编写一次原始代码(使用强制转换)。
_properties.put(key, value.toString());