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

2021-09-19 18:34:48 字數 3925 閱讀 7590

獲取泛型型別工具類

2.1. 整合介面帶有泛型

請使用 genericparadigmutil.parseinte***cegenericparadigm(…)。

提供的 api:

object: 想獲取那個物件的介面中泛型型別

clazz: 即 object.getclass()

who:因為乙個類可以整合多個介面, who 即你想獲取那個介面中的泛型

position: 乙個介面中可能有多個泛型, 比如 map 就有兩個, 則 position 就是指定你想要其中的哪乙個

pathfinders: 指路人(即手動指定查詢特殊路徑)

2.2. 整合不是介面中的泛型

請使用 genericparadigmutil.parsegenericparadigm(…)

提供的 api:

object: 想獲取那個物件的介面中泛型型別

clazz: 即 object.getclass()

pathfinders: 指路人(即手動指定查詢特殊路徑)

2.3. 使用情況及細節介紹
genericparadigmutil.

parseinte***cegenericparadigm

(a,0,0

) or

genericparadigmutil.

parsegenericparadigm

(a,0

)

如果想獲取 z 的型別

genericparadigmutil.

parseinte***cegenericparadigm

(a,0,1

) or

genericparadigmutil.

parsegenericparadigm

(a,1

)

// 返回的型別為 integer 的型別, 因為都是取得都是位置 0 的泛型型別並且是最最深處的那個泛型

genericparadigmutil.

parseinte***cegenericparadigm

(a,0,0

) or

genericparadigmutil.

parsegenericparadigm

(a,0

)// 獲取 t 的型別就跟情況一一樣了

genericparadigmutil.

parseinte***cegenericparadigm

(a,0,1

) or

genericparadigmutil.

parsegenericparadigm

(a,1

)

如果想獲取 b 中最近的泛型怎麼辦?

請記住不指定 指路人, 則工具類只會一股腦的找到最深處, 如果想獲取巢狀中間的某乙個型別怎麼辦? 答案就需要手動指定指路人

請先記住泛型<>就代表乙個層級, 那麼上面的層級怎麼劃分呢? 很簡單:從0開始, 其中< baseresponse > 層級為0, < list > 層級為1, < map > 層級為2, 層級為3。 結束!!!

指路人結構很簡單

public

static

class

pathfinder

public

pathfinder

(int in_depth,

int in_position)

}

其中 depth 就是指定的層級, position 為獲取該層級的第幾個泛型型別, 比如 map 層級的就有兩個泛型型別。

注意:如果需要手動指定指路人, 則從第 0 層要一直指定到你想要層級的泛型, 指路人不能缺失和跳躍。 原因很簡單, 比如map>, map>, 如果你缺失了其中乙個指路人, 就無法獲取到下乙個路口咋走了!

已情況二為例

// class a (extend | implements) b>>, t>

list

pathfinders =

newarraylist

(); pathfinders.

add(

newgenericparadigmutil.pathfinder(0

,0))

;// --> baseresponse

pathfinders.

add(

newgenericparadigmutil.pathfinder(1

,0))

;// --> list

pathfinders.

add(

newgenericparadigmutil.pathfinder(2

,0))

;// --> map

pathfinders.

add(

newgenericparadigmutil.pathfinder(3

,0))

;// --> integer

pathfinders.

add(

newgenericparadigmutil.pathfinder(3

,1))

;// --> userinfo

// eg:想獲取 b 的泛型是什麼型別

list

pathfinders =

newarraylist

(); pathfinders.

add(

newgenericparadigmutil.pathfinder(0

,0))

;// --> baseresponse

class clazz

= genericparadigmutil.

parseinte***cegenericparadigm

(a,0

, pathfinders)

or class clazz

= genericparadigmutil.

parsegenericparadigm

(a, pathfinders)

// eg: 再比如想獲取 位於 userinfo 那個是什麼型別

list

pathfinders =

newarraylist

(); pathfinders.

add(

newgenericparadigmutil.pathfinder(0

,0))

;// --> baseresponse

pathfinders.

add(

newgenericparadigmutil.pathfinder(1

,0))

;// --> list

pathfinders.

add(

newgenericparadigmutil.pathfinder(2

,0))

;// --> map

pathfinders.

add(

newgenericparadigmutil.pathfinder(3

,1))

;// --> userinfo

class clazz

= genericparadigmutil.

parseinte***cegenericparadigm

(a,0

, pathfinders)

or class clazz

= genericparadigmutil.

parsegenericparadigm

(a, pathfinders)

java獲取泛型的實際型別

這是乙個困擾了我好久的問題,在我寫的android請求框架總結 二 中寫到過利用框架自動解析json資料,如下 object o if result.charat 0 else listener.success o 返回的物件也只能是object型別,具體用的時候還需要做一下強轉 其實當時有想過用泛...

Java 泛型 獲取 ClassName

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

獲取泛型實際型別

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