我想对Java变量进行动态强制转换,强制转换类型存储在另一个变量中。
这是常规的造型:
String a = (String) 5;
这就是我想要的:
String theType = 'String';
String a = (theType) 5;
这是可能的吗?如果是的话,是如何实现的?谢谢!
更新
我正在尝试用我收到的HashMap
填充一个类。
这是构造函数:
public ConnectParams(HashMap<String,Object> obj) {
for (Map.Entry<String, Object> entry : obj.entrySet()) {
try {
Field f = this.getClass().getField(entry.getKey());
f.set(this, entry.getValue()); /* <= CASTING PROBLEM */
} catch (NoSuchFieldException ex) {
log.error("did not find field '" + entry.getKey() + '"');
} catch (IllegalAccessException ex) {
log.error(ex.getMessage());
}
}
}
这里的问题是,类的一些变量是Double
类型的,如果接收到数字3,它会将其视为Integer
,而我的类型是problem。
发布于 2010-01-24 22:29:05
为此,您需要编写某种ObjectConverter
。如果您既有要转换的对象,又知道要转换成的目标类,那么这是可行的。在这种情况下,您可以通过Field#getDeclaringClass()
获取目标类。
您可以在here中找到此类ObjectConverter
的一个示例。它应该会给你一个基本的概念。如果您想要更多的转换可能性,只需向其添加更多具有所需参数和返回类型的方法即可。
发布于 2010-01-24 22:57:02
可以使用Class.cast()
方法完成此操作,该方法将提供的参数动态转换为您拥有的类实例的类型。要获取特定字段的类实例,可以对相关字段使用getType()
方法。我在下面给出了一个例子,但请注意,它省略了所有的错误处理,不应该未经修改就使用。
public class Test {
public String var1;
public Integer var2;
}
public class Main {
public static void main(String[] args) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("var1", "test");
map.put("var2", 1);
Test t = new Test();
for (Map.Entry<String, Object> entry : map.entrySet()) {
Field f = Test.class.getField(entry.getKey());
f.set(t, f.getType().cast(entry.getValue()));
}
System.out.println(t.var1);
System.out.println(t.var2);
}
}
发布于 2016-05-04 15:29:23
你可以像下面这样写一个简单的castMethod。
private <T> T castObject(Class<T> clazz, Object object) {
return (T) object;
}
在你的方法中,你应该像这样使用它
public ConnectParams(HashMap<String,Object> object) {
for (Map.Entry<String, Object> entry : object.entrySet()) {
try {
Field f = this.getClass().getField(entry.getKey());
f.set(this, castObject(entry.getValue().getClass(), entry.getValue()); /* <= CASTING PROBLEM */
} catch (NoSuchFieldException ex) {
log.error("did not find field '" + entry.getKey() + '"');
} catch (IllegalAccessException ex) {
log.error(ex.getMessage());
}
}
}
https://stackoverflow.com/questions/2127318
复制相似问题