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

2022-08-31 10:41:35

我想为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());         
        }
    }

}

这里的问题是,一些类的变量是类型,如果收到数字3,它会将其视为类型问题。DoubleInteger


答案 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

对象的投射不会改变任何东西;它只是编译器对待它的方式
执行此类操作的唯一原因是检查对象是否是给定类或其任何子类的实例,但最好使用 或 来完成。instanceofClass.isInstance()

更新

根据您上次的更新,真正的问题是您在您的中有一个应该分配给.在这种情况下,您可以做的是检查字段的类型并使用IntegerHashMapDoublexxxValue()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);
...

(不确定我是否喜欢在地图上使用错误类型的想法)


答案 2

你需要为此写点什么。如果您既有要转换的对象,又知道要转换为的目标类,则这是可行的。在这种特殊情况下,您可以通过 Field#getDeclaringClass() 获取目标类。ObjectConverter

您可以在这里找到此类的示例。它应该给你一个基本的想法。如果您想要更多的转换可能性,只需向其添加更多具有所需参数和返回类型的方法即可。ObjectConverter


推荐