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强制转换变量。

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);
...
(不确定我是否喜欢在地图中输入错误的类型)

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);
}
}
添加回答
举报