泛型程序设计

(Java基础篇都是根据《Java核心技术 卷I》再进行自己的总结归纳和思考写出的)

泛型是什么?

  • 泛型字面上就是多种类型,也就是多种类型都可以通用的代码,它的目的就是为了实现代码的重用。
    比如说打印函数,在设计打印函数的时候我们要考虑到,可能传入的参数类型是各种各样(String、Integer...)的,这时候就是我们所说的“通用代码”。打印函数就可以利用泛型,设计一个对任意数据类型通用的函数。

  • 泛型的实现原理其实是省略了参数类型-->Object类型-->参数类型的这个过程。若不使用泛型,可以通过将函数传入的参数定为Object类型(也可以是对应类型的父类),那么也是一种通用的代码,因为Object是所有类的超类,但是这样设计函数会使得传入非预期的类型对象也能够执行此函数,并且还有经常强转的麻烦。
    如果使用泛型,就能够记住传入的参数类型,省却了手动类型转换的这一个过程。
    但是要记住一点!!!在实际虚拟机执行过程中是走了这个转换过程的。

使用泛型

此处使用泛型是指使用别人实现的泛型类/方法。
使用泛型类/方法是第一个阶段,因为大多数用到泛型的类都已经封装好了,许多程序也用不到新设计和实现泛型类和方法。

使用泛型类是比较简单学习的,它就像普通类的工厂。
具体的使用可以参照集合类ArrayList、Map等用法,其实就是如何声明,并使用里面的方法的问题。

使用泛型产生的效果就是限制了相应的数据类型。

实现和设计泛型类/方法

为了让这个类/方法能够被多种类型重用而在类和方法上添加泛型,那么首先我们要明白泛型在底层的逻辑

  • 底层有关Java泛型转换的两个事实:
    1. 虚拟机里没有泛型,只有普通的类和方法
      虚拟机不会有泛型的概念,就只有哪个类型就是哪个类型
    2. 所有类型参数都用他们的限定类型替换
      这就解释了虚拟机怎么去翻译相应的泛型类和泛型方法,它都是把里面的泛型翻译到限定的类型,一般没有限定都是以Object类型来翻译泛型

    这就是类型擦除。就是我们所设计的泛型到虚拟机里面都会被擦除成为普通的类和方法。

知道在虚拟机中泛型会被类型擦除,那么下面的很多程序设计上的问题都是由类型擦除带来的

  • 泛型设计的局限
    1. 不能用基本类型实例化类型参数:因为基本类型没办法擦除嘛
    2. 运行时类型查询只适用于原始类型:是不能直接判断一个泛型类对象(如ArrayList<String>),里面的具体是什么类型的
    3. 不能创建参数化类型的数组:声明是可以,但是创建不了ArrayList<String>[10],但是可以创建ArrayList<?>[10],以通配符的形式。原因还是类型擦除。
    4. 不能实例化类型变量:new T(...)是不能用的,因为这样到虚拟机里面擦除之后都变成Object,没意义了。
    5. 不能构造泛型数组:不能new T[2]这样的写法
    6. 泛型类的静态上下文中类型变量无效:这里可以参考博客,讲的很好
    7. ...

    这里列举了六种会比较常遇到的问题,也简略解释了一下,如果有不明白的可以参考《Java核心技术 卷I》泛型程序设计里面的约束和局限这一小节

  • 泛型类&泛型方法有什么区别?

    泛型类里面也可以有泛型的方法,但是呢类也可以不是泛型的而单单方法是泛型的,它们用法有什么区别?

    其实泛型类的优势就是能够把类里面所有的方法泛型都给统一了,也就是说一旦类的参数化类型定下来了,这个对象所有的方法都必须是这个类型。单单是方法是泛型就没有这个效果。

  • 泛型的继承
    1. 这里需要搞清楚的是,泛型类里面的参数化类型之间的继承关系不是泛型类之间的继承关系:

      ArrayList<father>和ArrayList<son>没有继承关系

      List<>和ArrayList<>才有继承关系:继承关系意义就是孩子把父亲更具体化了

    2. 通配符
      通配符的概念很容易让人将泛型 T 和通配符 ? 搞晕。通配符?的目的呢就是解决上面所说的ArrayList<father>和ArrayList<son>问题。
      假如现在有两个对象:

    ArrayList<father> a;
    ArrayList<son> b;
    

    那么我只能往a对象里面放入father类型的对象,只能往b对象放入son类型的对象。但是呢如果是ArrayList<? extends father> c,那么就可以既存father也可以存son,
    但是实验好像有点问题,嗯,我下次专门写一个探究一下通配符问题

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

推荐阅读更多精彩内容