记录一个有趣的实现

定义在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接上此接口并实现方法。

@Override public UserComponent getComponent() {
    return userComponent;
  }

在BaseFragment子类里调用此方法获得UserComponent对象并注入:

 this.getComponent(UserComponent.class).inject(this);

翻开布满灰层的Java编程思想回忆一下相关概念:

泛化的Class引用:

Class引用总是指向某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码。它还包含该类的静态成员,因此,Class引用表示的就是它所只想的对象的确切类型,而该对象便是Class类的一个对象。

Class<Integer> IntClass=int.class;
IntClass=Integer.class;
//IntClass=double.class   //illegal

向Class引用添加泛型语法的原因仅仅是为了提供编译器类型检查,因此如果你操作有误,稍后立即会发现这一点。而当你将泛型语法用于Class对象时:newInstance()会返回该对象的确切类型,而不仅是Object。
这在某些程度上有点受限:

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();

如果你手头是超类,那编译器将只允许你声明超类引用是“某个类,它是FancyToy超类”,就像在
表达式Class<? super FancyToy> 所看到的,而不会接受Class<Toy>这样的声明。这看上去有点怪,因为getSuperClass()方法返回的是基类(不是借口),并且编译器在编译器就知道它是什么类型了----在本例中就是Toy.class----而不仅仅是“某个类,它是FancyToy超类”.不管怎样,正是由于这种含糊性,up.newInstance()返回值不是精确类型,而只是Object.

Cast:

cast()方法接受参数对象,并将其转型为Class引用的类型。当你编写泛型代码,如果你存储了Class引用,并希望以后通过这个引用来执行转型,这种情况就会发生。

Building b=new House();
Class<House> houseType=House.class;
House h=houseType.cast(b);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,953评论 18 399
  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李头阅读 10,117评论 2 12
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,223评论 0 3
  • “当然,非常好辨认,通过木质层所含水分的程度就能看出,超过三个月的何首乌根部会呈现淡黄色,而且摸上去有点粗糙。有了...
    飄雲阅读 2,166评论 0 1
  • 文/铁炉 前几天在天猫上选了一双皮鞋,昨天下午收到了快递,并且当...
    湘邵铁炉阅读 4,461评论 12 14