一尘不染

Java:如何将变量从一种类型动态转换为另一种类型?

java

我想对Java变量进行动态转换,转换类型存储在其他变量中。

这是常规转换:

 String a = (String) 5;

这就是我要的:

 String theType = 'String';
 String a = (theType) 5;

这有可能吗?谢谢!

更新资料
我正在尝试使用HashMap收到的A 填充类。

这是构造函数:

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类型问题。


阅读 912

收藏
2020-03-17

共1个答案

一尘不染

是的,可以使用反射

Object something = "something";
String theType = "java.lang.String";
Class<?> theClass = Class.forName(theType);
Object obj = theClass.cast(something);

但这没有多大意义,因为必须将结果对象保存在Object类型变量中。如果你需要变量属于给定的类,则可以将其强制转换为该类。

如果要获取给定的类,Number例如:

Object something = new Integer(123);
String theType = "java.lang.Number";
Class<? extends Number> theClass = Class.forName(theType).asSubclass(Number.class);
Number obj = theClass.cast(something);

但是这样做仍然没有意义,你可以将其转换为Number。

投射对象不会改变任何东西。这只是编译器对待它的方式。
这样做的唯一原因是检查对象是给定类的实例还是其任何子类的实例,但是最好使用instanceofor 来完成Class.isInstance()

更新资料
根据你上次更新的真正的问题是,你有一个Integer在你的HashMap应分配给一个Double。在这种情况下,你可以做的是检查字段的类型并使用以下xxxValue()方法Number

...
Field f =  this.getClass().getField(entry.getKey());
Object value = entry.getValue();
if (Integer.class.isAssignableFrom(f.getType())) {
    value = Integer.valueOf(((Number) entry.getValue()).intValue());
} else if (Double.class.isAssignableFrom(f.getType())) {
    value = Double.valueOf(((Number) entry.getValue()).doubleValue());
} // other cases as needed (Long, Float, ...)
f.set(this, value);
...

(不确定我是否喜欢在中输入错误类型的想法Map)

2020-03-17