猿问

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

我想对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,而我遇到类型问题。


慕尼黑8549860
浏览 2949回答 3
3回答

跃然一笑

关于您的更新,用Java解决此问题的唯一方法是编写涵盖带有许多ifand else和instanceof表达式的所有情况的代码。您尝试做的事情看起来好像是在使用动态语言编程一样。在静态语言中,您尝试做的事情几乎是不可能的,并且您可能会为尝试做的事情选择完全不同的方法。静态语言不如动态语言灵活:)Java最佳实践的好例子是BalusC的答案(即ObjectConverter)和Andreas_D的答案(即Adapter)。那是没有道理的String a = (theType) 5;的类型a是静态绑定的,String因此对这种静态类型进行动态强制转换没有任何意义。PS: 示例的第一行可以写成,Class<String> stringClass = String.class;但仍然不能使用stringClass强制转换变量。

神不在的星期二

是的,可以使用反射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 =&nbsp; this.getClass().getField(entry.getKey());Object value = entry.getValue();if (Integer.class.isAssignableFrom(f.getType())) {&nbsp; &nbsp; value = Integer.valueOf(((Number) entry.getValue()).intValue());} else if (Double.class.isAssignableFrom(f.getType())) {&nbsp; &nbsp; value = Double.valueOf(((Number) entry.getValue()).doubleValue());} // other cases as needed (Long, Float, ...)f.set(this, value);...(不确定我是否喜欢在地图中输入错误的类型)

大话西游666

您可以使用Class.cast()方法执行此操作,该方法会将提供的参数动态转换为您所拥有的类实例的类型。要获取特定字段的类实例,请getType()在相关字段上使用方法。我在下面给出了一个示例,但请注意,它忽略了所有错误处理,因此不应未经修改地使用。public class Test {&nbsp; &nbsp; public String var1;&nbsp; &nbsp; public Integer var2;}public class Main {&nbsp; &nbsp; public static void main(String[] args) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; Map<String, Object> map = new HashMap<String, Object>();&nbsp; &nbsp; &nbsp; &nbsp; map.put("var1", "test");&nbsp; &nbsp; &nbsp; &nbsp; map.put("var2", 1);&nbsp; &nbsp; &nbsp; &nbsp; Test t = new Test();&nbsp; &nbsp; &nbsp; &nbsp; for (Map.Entry<String, Object> entry : map.entrySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Field f = Test.class.getField(entry.getKey());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.set(t, f.getType().cast(entry.getValue()));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(t.var1);&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(t.var2);&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Java
我要回答