如何在父類中獲取子類泛型的Class

假如你定義了一個有泛型的Base類,如下BaseClass<DO, VO>代碼示例,如何在BaseClass中獲取到子類對應(yīng)的DO、VO的class對象呢?

class BaseClass<DO, VO> {
    Class<DO> doClass;
    Class<VO> voClass;
    ...
}

1. 傳統(tǒng)方式:通過參數(shù)傳遞或由子類指定

//通過參數(shù)傳遞
class BaseClass<DO, VO> {
    //Class<?>定義為參數(shù),通過參數(shù)傳遞
    public myMethod(..., Class<?> clazz){
        ...
    }
}
//由子類指定
class UserClass extends BaseClass<UserDO, UserVO> {
   ...{
       super.doClass = UserDO.class;
       super.voClass = UserVO.class;
   }
}

這種方式非常簡單容易理解,但會在方法/子類中產(chǎn)生冗余代碼。

下面還有兩種更優(yōu)雅的實現(xiàn)代碼:

2. 在Base類中通過Java反射統(tǒng)一獲取

class BaseClass<DO, VO> {
   ...{
        Type[] types = ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments();
        this.doClass = (Class<DO>)types[0];
        this.voClasss = (Class<VO>)types[1];
   }
}  
// 如果是接口獲取實現(xiàn)類的泛型class,需將getGenericSuperclass()替換成getGenericInterfaces()

3. 在Base類中通過Spring統(tǒng)一獲取

class BaseClass<DO, VO> {
    ...{
        ResolvableType resolvableType = ResolvableType.forClass(this.getClass()).getSuperType();
        ResolvableType[] types = resolvableType.getSuperType().getGenerics();
        this.doClass = (Class<DO>) types[0].resolve();
        this.voClasss = (Class<VO>) types[1].resolve();
    }
}

Diboot - 簡單高效的輕代碼開發(fā)框架 (歡迎star)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,194評論 1 10
  • 一、編程規(guī)約 (一)命名規(guī)約 【強(qiáng)制】 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結(jié)束。反...
    喝咖啡的螞蟻閱讀 1,606評論 0 2
  • 命名風(fēng)格 【強(qiáng)制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結(jié)束 【強(qiáng)制】代碼中的命名嚴(yán)禁...
    云A00000閱讀 4,044評論 0 0
  • 你是不是也有這樣的困擾: 1.遇到問題需要解決時,往往是腦子亂成一團(tuán),各種信息堆積在一起,就是找不到完整的解決方案...
    秋木說個人品牌閱讀 1,146評論 1 33
  • 我下班了,坐地鐵回家,累的要命。 看那個人,地鐵上有的是空座他也不坐,倚在地鐵的門上,戴著耳機(jī),唱...
    Cabibird閱讀 282評論 0 0

友情鏈接更多精彩內(nèi)容