第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Java:如何將變量從一種類型動態(tài)轉(zhuǎn)換為另一種類型?

Java:如何將變量從一種類型動態(tài)轉(zhuǎn)換為另一種類型?

慕尼黑8549860 2019-10-08 11:23:13
我想對Java變量進(jìn)行動態(tài)轉(zhuǎn)換,轉(zhuǎn)換類型存儲在其他變量中。這是常規(guī)轉(zhuǎn)換: String a = (String) 5;這就是我要的: String theType = 'String'; String a = (theType) 5;可能嗎?如果可以,怎么辦?謝謝!更新我正在嘗試使用收到的hashMap填充類。這是構(gòu)造函數(shù):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類型,如果接收到數(shù)字3,它將視為Integer,而我遇到類型問題。
查看完整描述

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)換變量。


查看完整回答
反對 回復(fù) 2019-10-08
?
神不在的星期二

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ò)誤的類型)


查看完整回答
反對 回復(fù) 2019-10-08
?
大話西游666

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);

    }

}


查看完整回答
反對 回復(fù) 2019-10-08
  • 3 回答
  • 0 關(guān)注
  • 2962 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號