我正在编写一个程序,在该程序中我被迫使用这样的东西:
HashMap<String,Object> valores = new HashMap<>();
valores.put("valor1", "abc"); // Se guarda como objeto String
valores.put("valor2", (int) 123); // Se guarda como objeto Integer
valores.put("valor3", (double) 3.1416); // Se guarda como objeto Double
现在在另一部分代码中,我需要将这些值保存到数据库中。我正在使用准备好的声明,我想做这样的事情:
ps = conn.preparedStatement("insert into tbl (v1, v2, v3) values (?,?,?)")
for(int i = 1; i <= 3; i++) {
if(/*valores.get(String.format("valor%d",i)) es String*/)
ps.setString(i, (String) valores.get(String.format("valor%d",i)));
else if(/*valores.get(String.format("valor%d",i)) es Integer*/)
ps.setInt(i, (Integer) valores.get(String.format("valor%d",i)));
else if(/*valores.get(String.format("valor%d",i)) es Double*/)
ps.setDouble(i, (Double) valores.get(String.format("valor%d",i)));
}
所以我的具体问题是:如何在运行时获取保存为的变量类型Object
?
你朋友的名字是
instanceof
,(取自这里和这里)。拥有一个类型变量
Object
,您可以通过以下方式获取存储在其中的内部数据类型:结果:
适用于您当前代码的内容如下所示:
我只能想象他们用枪指着你:-)
事实是它很可怕(包括“value1”,“value2”......)
但是,如果你真的被迫这样做,那么你不需要在运行时找出实际类型(NaCL在这个意义上的答案是正确的),你可以直接使用setObject(),Java有它的默认映射在您的情况下(并假设您不使用比这些类型更多的类型)应该达到的 SQL 类型的类型。
PS:顺便说一句,关于
instanceof
:它instanceof
并不是真正用于获取对象的类型/类,而是用于验证对象是否属于某种类型。并且“属于某种类型”意味着真正的类型是那个或后代。例如,在您的情况下instanceof Number
,当值为 Integer 或Double时,它将返回 true (两者都 extendNumber
,因此“都是数字”,即使它们的真实类是其他东西)。如果你想获得你应该使用的具体类object.getClass()
。我不知道它是否对您有用,但是如果按类型表示变量的类,您可以简单地执行以下操作:
这将返回一个 Class 类型的对象。