java獲取泛型的實際型別

2021-07-04 21:20:23 字數 1798 閱讀 3850

這是乙個困擾了我好久的問題,在我寫的android請求框架總結(二)中寫到過利用框架自動解析json資料,**如下

object o;

if (result.charat(0) == ' else

listener.success(o);

返回的物件也只能是object型別,具體用的時候還需要做一下強轉

});其實當時有想過用泛型來做,但就是不知如何獲取泛型的實際型別,雖然已經比較簡潔了,但是感覺還不太徹底,如果直接能得到物件就更好了,終於,皇天不負有心人,有大神解決了這個問題,前兩天比較火的hongyang大神的okhttputils的一篇文章關於json自動解析的這一塊對我的幫助比較大,當然,我也順便吐槽下,okhttputils的封裝並不能幫助大家更好的理解okhttp,okhttp的設計非常優秀,但是經過這麼一封裝,又和之前看到的快速開發框架無異,希望看的人也能多思考,可以借鑑其中優秀的地方,同時也要能看到不足的一面,不要盲目跟風。

看**:

public static abstract

class

resultcallback

/*** 得到泛型t的實際type

*/static type getsuperclasstypeparameter(class> subclass)

parameterizedtype parameterized = (parameterizedtype) superclass;

return $gson$types.canonicalize(parameterized.getactualtypearguments()[0]);}}

使用

callback.onsuccess(new gson().fromjson(result, callback.type));
這樣就可以直接返回結果,如下:

//也支援list直接返回

});

這種方式可以簡化不少的**,但是android studio不是很給力,通常提示是這樣的

完了還要移動滑鼠手動去修改**,比原來做一下強轉也沒有方便多少,但還是有辦法的,還記得android studio提供的活動模板(live template)的功能嗎?android studio 使用技巧(三),這裡來體驗下它的強大之處,效果演示:

還有一點不明我測試了下gs

ontypes.canonicalize(parameterized.getactualtypearguments()[0]); 和

parameterized.getactualtypearguments()[0]

列印的結果是一樣的,去掉外面的一層包裹也能正常執行

獲取泛型實際型別

public class tutil catch instantiationexception e catch illegalacces ception e catch classcastexception e return null public static class forname stri...

Java 完美獲取泛型型別(包含巢狀多層的泛型)

獲取泛型型別工具類 2.1.整合介面帶有泛型 請使用 genericparadigmutil.parseinte cegenericparadigm 提供的 api object 想獲取那個物件的介面中泛型型別 clazz 即 object.getclass who 因為乙個類可以整合多個介面,wh...

Java 泛型 獲取 ClassName

public class commondaoimplimplements commondao的情況下 倘若希望獲得t 泛型 的classname 可參照 springside class clazz this.getclass type gentype clazz.getgenericsupercl...