定義在BaseFragment里的方法:
/**
* Gets a component for dependency injection by its type.
*/
@SuppressWarnings("unchecked")
protected <C> C getComponent(Class<C> componentType) {
return componentType.cast(((HasComponent<C>) getActivity()).getComponent());
}
HasComponent接口:
public interface HasComponent<C> {
C getComponent();
}
具體Activity接上此接口并實(shí)現(xiàn)方法蜀涨。
@Override public UserComponent getComponent() {
return userComponent;
}
在BaseFragment子類里調(diào)用此方法獲得UserComponent對(duì)象并注入:
this.getComponent(UserComponent.class).inject(this);
翻開布滿灰層的Java編程思想回憶一下相關(guān)概念:
泛化的Class引用:
Class引用總是指向某個(gè)Class對(duì)象童芹,它可以制造類的實(shí)例找颓,并包含可作用于這些實(shí)例的所有方法代碼稽物。它還包含該類的靜態(tài)成員,因此,Class引用表示的就是它所只想的對(duì)象的確切類型,而該對(duì)象便是Class類的一個(gè)對(duì)象仅醇。
Class<Integer> IntClass=int.class;
IntClass=Integer.class;
//IntClass=double.class //illegal
向Class引用添加泛型語(yǔ)法的原因僅僅是為了提供編譯器類型檢查,因此如果你操作有誤魔种,稍后立即會(huì)發(fā)現(xiàn)這一點(diǎn)析二。而當(dāng)你將泛型語(yǔ)法用于Class對(duì)象時(shí):newInstance()會(huì)返回該對(duì)象的確切類型,而不僅是Object节预。
這在某些程度上有點(diǎn)受限:
Class<FancyToy> ftClass=FancyToy.class;
Class<? super FancyToy> up=ftClass.getSuperClass();
//This won't compile
//Class<Toy> up2=ftClass.getSuperclass();
//Only Produces Object;
Object obj=up.newInstance();
如果你手頭是超類叶摄,那編譯器將只允許你聲明超類引用是“某個(gè)類,它是FancyToy超類”,就像在
表達(dá)式Class<? super FancyToy> 所看到的安拟,而不會(huì)接受Class<Toy>這樣的聲明蛤吓。這看上去有點(diǎn)怪,因?yàn)間etSuperClass()方法返回的是基類(不是借口)糠赦,并且編譯器在編譯器就知道它是什么類型了----在本例中就是Toy.class----而不僅僅是“某個(gè)類会傲,它是FancyToy超類”.不管怎樣,正是由于這種含糊性愉棱,up.newInstance()返回值不是精確類型唆铐,而只是Object.
Cast:
cast()方法接受參數(shù)對(duì)象,并將其轉(zhuǎn)型為Class引用的類型奔滑。當(dāng)你編寫泛型代碼,如果你存儲(chǔ)了Class引用顺少,并希望以后通過(guò)這個(gè)引用來(lái)執(zhí)行轉(zhuǎn)型朋其,這種情況就會(huì)發(fā)生王浴。
Building b=new House();
Class<House> houseType=House.class;
House h=houseType.cast(b);