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.泛型介紹及泛型類、泛型方法、泛型接口
- 沒說理論,用簡單的代碼說明泛型使用的。