java:我如何做一个变量从一个类型到另一个变量的动态投射?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我想为一个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,并且我有类型问题。

提问于
用户回答回答于

关于你的更新,在Java中解决这个问题的唯一方法是编写覆盖所有大量ifelseinstanceof表达式的代码。你试图做的事看起来好像用来用动态语言编程。在静态语言中,你试图做的事情几乎是不可能的,你可能会选择一种完全不同的方法来做你想做的事情。静态语言只是不如动态的:) Java最佳实践的好例子是BalusC(ie ObjectConverter)的答案Adapter下面的Andreas_D(ie )的答案

String a = (theType) 5;

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

你的例子的第一行可以写成,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中有一个Integer应该被分配给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);
...

扫码关注云+社区