首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java:如何将变量从一种类型动态转换为另一种类型?

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

Stack Overflow用户
提问于 2010-01-24 22:11:59
回答 10查看 219.6K关注 0票数 94

我想对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。

EN

回答 10

Stack Overflow用户

发布于 2010-01-24 22:29:05

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

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

票数 23
EN

Stack Overflow用户

发布于 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);
    }
}
票数 13
EN

Stack Overflow用户

发布于 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());          
    }    
}

}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2127318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档