3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
關(guān)于您的更新,用Java解決此問題的唯一方法是編寫涵蓋帶有許多ifand else和instanceof表達(dá)式的所有情況的代碼。您嘗試做的事情看起來好像是在使用動態(tài)語言編程一樣。在靜態(tài)語言中,您嘗試做的事情幾乎是不可能的,并且您可能會為嘗試做的事情選擇完全不同的方法。靜態(tài)語言不如動態(tài)語言靈活:)
Java最佳實(shí)踐的好例子是BalusC的答案(即ObjectConverter)和Andreas_D的答案(即Adapter)。
那是沒有道理的
String a = (theType) 5;
的類型a是靜態(tài)綁定的,String因此對這種靜態(tài)類型進(jìn)行動態(tài)強(qiáng)制轉(zhuǎn)換沒有任何意義。
PS: 示例的第一行可以寫成,Class<String> stringClass = String.class;但仍然不能使用stringClass強(qiáng)制轉(zhuǎn)換變量。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
是的,可以使用反射
Object something = "something";
String theType = "java.lang.String";
Class<?> theClass = Class.forName(theType);
Object obj = theClass.cast(something);
但這沒有多大意義,因?yàn)楸仨殞⒔Y(jié)果對象保存在Object類型的變量中。如果您需要變量屬于給定的類,則可以將其強(qiáng)制轉(zhuǎn)換為該類。
如果要獲取給定的類,例如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);
但是這樣做仍然沒有意義,您可以將其轉(zhuǎn)換為Number。
投射對象不會改變?nèi)魏螙|西。這只是編譯器對待它的方式。
這樣做的唯一原因是檢查對象是否是給定類或其任何子類的實(shí)例,但是最好使用instanceofor 來完成Class.isInstance()。
更新資料
根據(jù)上次更新,真正的問題是HashMap中有一個(gè)應(yīng)該分配給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);
...
(不確定我是否喜歡在地圖中輸入錯(cuò)誤的類型)

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
您可以使用Class.cast()方法執(zhí)行此操作,該方法會將提供的參數(shù)動態(tài)轉(zhuǎn)換為您所擁有的類實(shí)例的類型。要獲取特定字段的類實(shí)例,請getType()在相關(guān)字段上使用方法。我在下面給出了一個(gè)示例,但請注意,它忽略了所有錯(cuò)誤處理,因此不應(yīng)未經(jīng)修改地使用。
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);
}
}
添加回答
舉報(bào)