为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2019-10-08 11:23:13
我想对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,而我遇到类型问题。
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

关于您的更新,用Java解决此问题的唯一方法是编写涵盖带有许多ifand else和instanceof表达式的所有情况的代码。您尝试做的事情看起来好像是在使用动态语言编程一样。在静态语言中,您尝试做的事情几乎是不可能的,并且您可能会为尝试做的事情选择完全不同的方法。静态语言不如动态语言灵活:)


Java最佳实践的好例子是BalusC的答案(即ObjectConverter)和Andreas_D的答案(即Adapter)。


那是没有道理的


String a = (theType) 5;

的类型a是静态绑定的,String因此对这种静态类型进行动态强制转换没有任何意义。


PS: 示例的第一行可以写成,Class<String> stringClass = String.class;但仍然不能使用stringClass强制转换变量。


查看完整回答
反对 回复 2019-10-08
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

是的,可以使用反射


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()。


更新资料

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

...

(不确定我是否喜欢在地图中输入错误的类型)


查看完整回答
反对 回复 2019-10-08
?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以使用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);

    }

}


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 2948 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信