java进阶-泛型

一、何为泛型?

    jdk1.5之后引入泛型概念,可定义泛型类、接口、方法,且编译期会将泛型擦除,向下兼容;

二、泛型的优点?

    2.1  编辑代码时保证类型安全,且省去强制类型转化

        1.5之前代码:

          List list = new ArrayList();

          list.add(1);

          list.add("test");

          String element = (String)list.get(0);//编译器会报错

          element = (String) list.get(1); //强制类型转化

        1.5引入泛型之后:

           List<String> list = new ArrayList<>();

           list.add(1);//编译器报错

           list.add("test");

           String element = list.get(0);//不用强制类型转化

    2.2 代码复用

        比如实现数字排序的算法sort();

        定义 public static <T> void sort(T[] a, Comparator<? super T> c),所有实现了Comparator的接口的类型都可以进          行排序算法,如果没有泛型,则需要针对int,double,float等各自实现一套sort算法

三、泛型的使用

    3.1 泛型类、接口一样

        public class A<T> {};

        punlic classA<T extends B> {}

    3.2 泛型方法(返回类型之前必须有<>),可以定在普通类也可定义在泛型类,但是在泛型类中定义时各自维护各自的泛型T

        public <T> void set(T t);

        public <T extends B> void set(T t);

        public <T> T get();

四、通配符 ? 灵活转型(如网络架构Rxjava)

    4.1 非限定通配符 ?;     A<?> a  等价于 A<? extends Object> 既不能读也不能写,但作为方法入参可进行类型安全检验,另外作为引用时只进行Object相关操作也可,最典型的是Class<?> clz;

    4.2 上界通配符<? extends T>;  只能读不能存(原因下面的继承关系中讲)

    4.3 下界通配符<? super T>;  只能存且存T或者T的子类,不能读T,但是能读返回Object

五、泛型与继承、多态

    5.1 继承:

        class A<T>{};  class B<T> extends A<T> 或者 class B extends A<String>

        class C extends D{}, class D extends E{};  List<C> 与 List<D>没有继承关系; 但是List<C>是ArrayList<C>的父类,只要泛型不变,则类的继承关系不变;

        List<?> -> List<? extends D> -> (List<D> 和List<C>)  父类关系成立(左侧是父类) ;

        List<? extends D> list = new ArrayList<D>(); 或者  List<? extends D> list = new ArrayList<C>();正因为这层继承关系,所以list引用可执行D的容器,也可指向C的容器,对于JVM来说,不清楚你最后可能指向的是哪个容器,所以禁止 上界通配符定义的变量能存放数据,否则会涉及类型安全问题。


        List<?> -> List<? super D> -> (List<D>和List<E>) 

六、JVM如何实现泛型?

    6.1 编译前进行类型检查,编译后进行类型擦除,擦除的泛型信息保存在常量池中,通过反射可获取;

        List<C> listC = new ArrayList<>();  List<D> listD = new ArrayList<>();  listC.getClass 与 listD.getClass是一样的,都是List;这就是类型擦除;

    6.2 类型擦除原则如下:

           没有限定则Object

           有则用限定类型

           桥方法维护多态性

           擦除了但依旧可以通过反射获得泛型类,类常量池有保存泛型类信息

    6.3 泛型后遗症如下:

        1、不能实例化类型变量 new T(),可以通过反射获得实例;

        2、static T t  static void set(T t)静态属性或者方法里不能引用类型变量,对象创建的时候才知道类型,static属于类,先执行,此时还不知道具体是什么类型;静态泛型方法可以static <T> void set(T t)

       3、基本类型不支持作为实参,List<double> list 不行,List<Double> 可以

       4、instanceof不支持(泛型擦除导致,没有了类型信息)  如果是A<? extents B>  这个能用instanceof吗?

       5、泛型数组不支持

        A extents B  A[] 的分类是 B[]  数组的协变

        类型擦除后不能支持协变了

       6、泛型类不能extends Exception/Throwable,也不能catch泛型类对象,但是可以catch exception然后throws出来即可

七、总结:

    泛型设计初衷就是为了灵活的实现类型转型,这样设计和开发通用功能模块时可对用户透明,解耦且通用,强行记住上下界规则PECS(Product extends Consumer super),上不存下不取或者上只读下只写。

  

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容