學習中使用泛型的一些體會

ps: 這里我不會詳細去記錄泛型的使用,只是我在學習中碰到的泛型使用的點

1. 泛型可以作為另一個泛型的參數(shù)注入

我有一個類: BasePersenter ,聲明需要傳入一個泛型參數(shù)

public abstract class BasePersenter<V extends IBaseView> {
  ...........
}

然后我們有另一個類: BaseActivity ,需要使用 BasePersenter 這個類,來做為某個泛型的限定范圍

public abstract class BaseActivity<V extends IBaseView, P extends BasePersenter<V>> extends AppCompatActivity implements IBaseView {
  ...........
}

然后我們就可以看到首先聲明的 泛型 V ,作為參數(shù)傳入了 后面聲明的泛型 P : P extends BasePersenter<V>


2. 聲明的泛型參數(shù)可以暫時不設(shè)置這個泛型需要使用的泛型,而是有具體的繼承類來指定

先聲明一個類,需要傳入一個泛型類型

public abstract class BasePresenter<V> 

在使用上面這個泛型時可以先指定泛型類型

public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBinding> extends DataBindingActivity<B>

由具體的繼承類來指定泛型類型

abstract class Presenter extends BasePresenter<AdviseContract.View> 

最終 activity 的實現(xiàn)類的泛型使用

public class AdviseActivity extends BaseActivity<AdvisePresenter, ActivityFeedbackBinding> 

3. 泛型可以通過繼承的方式,一步步的縮小泛型的限定范圍

我們有一個頂層接口 : IBaseTest

public interface IBaseTest<D extends Object,A extends Object> {
  ...........
}

然后有一個類:BaseTest ,實現(xiàn)了這個接口,對其中的泛型做了限定

public class BaseTest<D extends String, A extends String> implements IBaseTest<D, A> {
  ...........
}

4. 注意泛型的寫法,是繼續(xù)向下傳遞還是在這里聲明具體類型

  • 向下傳遞的寫法,接著上面的 例子:
public class BaseTest<D extends String, A extends String> implements IBaseTest<D, A> {
  ...........
}
  • 不向下傳遞了,直接指定具體類型了
public class BaseTest implements IBaseTest<String,String> {
  ...........
}
  • 寫在類名下的泛型是屬性聲明的,是需要子類來指定類型的
  • 寫在該類繼承的基類類名或是實現(xiàn)的接口接口名下的都是屬于指定具體的泛型類型了,注意這種寫法,我們再寫一個子類繼承該類,那么這個子類就無法再指定父類的泛型類型了,因為啥,因為父類都沒聲明泛型,你怎么去指定

5. 注意單獨的泛型方法寫法的不同

/**
     * 泛型方法
     * Created by zhongtian465 on 2017-10-12.
     */
    public class GenericMethod {
        /**
         * 泛型方法
         * @param clazz 用來創(chuàng)建泛型對象 、Class<T>:指明泛型T的具體類型
         * @param <T> 聲明此方法為泛型方法,且有個類型T
         * @return T 返回類型是T
         * @throws IllegalAccessException
         * @throws InstantiationException
         */
        public <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException {
            T object= clazz.newInstance();
            return object;
        }

        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            GenericMethod genericMethod = new GenericMethod();
            User user = (User) genericMethod.getObject(Class.forName("com.zt.study.java.generic.User"));
            System.out.println(user);
        }
    }

泛型方法在返回值前面加上一個 " <T> " 來表示這是一個泛型方法,這里這個泛型 T 和類聲明的泛型不是一回事,不沖突,各用各的


優(yōu)秀資料:

絕對是代碼封裝,泛型使用的經(jīng)典案例,寫的太好了,非常深度,我現(xiàn)在寫的還差的遠呢

泛型學習的基礎(chǔ)文章:

  • Java泛型(一)
    • java'是偽泛型,我們在代碼寫的是泛型,但是在編譯時會擦除所有的泛型標記,用具體類型來替換泛型類型,這是在編譯器在編譯時干的事
    • 泛型不能用在竟然唉的方法和參數(shù)中,因為靜態(tài)是屬于類型加載器的,不是數(shù)據(jù)一個具體類型對象的,我們不在一個具體的對象中聲明具體的類型,泛型怎么知道要轉(zhuǎn)換成什么類型呢。除非你把這個靜態(tài)方法聲明為靜態(tài)泛型方法
  • Java泛型(二)
    • 具體師范了泛型 - 類,方法,泛型方法,對泛型的使用
    • 明確了泛型的通配符的使用 List<? extends Number> / List<? super Integer>
    • 明確了泛型逆變與協(xié)變應(yīng)該怎么寫,這個很重要的,用的 list 做的例子
  • 16.泛型介紹及泛型類、泛型方法、泛型接口
    • 沒說理論,用簡單的代碼說明泛型使用的。
最后編輯于
?著作權(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ù)。

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