重走安卓进阶路——泛型

ps.原来的标题

  • 为什么我们需要泛型?
  • 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析);
  • 如何限定类型变量?
  • 泛型使用中的约束和局限性;
  • 泛型类型能继承吗?
  • 泛型中通配符类型;
  • 虚拟机是如何实现泛型的?

为什么需要泛型

  1. 泛型扩展了类、接口、方法的适用范围
  2. 提前生命可使用的类型,在编译期提供提醒
  3. 避免List使用时的强制类型转换

如何使用泛型

  1. 泛型类
    在类名后加上例如“<K>”这样的泛型来声明泛型变量,在类体重再添加正式的范型变量/方法后即可使用。

注意:

  • 一般有T、E、K、V等字母可表示泛型,约定俗成
  • 也可以有多个,用逗号间隔,如“<K,V>”
  1. 泛型接口
    声明与泛型类无异, 重点在实现。
    实现有两种方法:
    <1> 用泛型类来实现泛型接口,仍返回泛型
    <2>直接用确定的类型来替换字母泛型,返回的也是指定类型

  2. 泛型方法
    可完全独立,可以不在泛型接口,泛型类中
    例:
    此处的“<T>”是泛型方法的明确标志

public <T> T genericMethod (T ...a){
  return a[a.length/2];
}

注意:

  • 不是在泛型类里的就是泛型方法
  • 泛型类是使用泛型方法同样要有标志<T>???
  • 在泛型类里的泛型方法完全可以和类中定义的泛型不一样
  • 泛型类上声明的泛型只影响普通方法,泛型类中的泛型方法声明的泛型与泛型类上声明的泛型无关

限定类型变量的应用场景

extends 派生/继承 类或接口
需要在泛型应用过程中要求该泛型拥有某种方法或遵循某种规则

注意:
限定混用类与接口时,类必须写在最前面,且只能有一个(单继承)
<T extends ArrayList & Comparable>

约束与局限性

  1. 不能实例化类型变量
    this.data = new T();
  2. 静态域或者方法不能引用类型变量
    因为静态在声明、使用时,泛型很可能还未声明
    除非该静态方法本身就是泛型方法
  3. 如果泛型要使用基本类型,只能用其包装类,因为基本类型不是对象
  4. 范型变量不能使用instance of 方法
  5. 注入不同类型后的泛型类,使用getClass()只能获取其原生类型而不是泛型
    6 Model<Double> m = new Model<>();可行
    Model<Double>[] ms = new Model<Double>[10];不可行
  6. 泛型类不能派生自Throwable,
    如果泛型方法声明T派生自Throwable,不能通过捕获(catch)泛型类对象T,但可通过捕获(catch)Throwable类型,再直接抛出(throws T)

泛型类型的继承规则

  1. 约束与局限性中的第五条可知,存在Class A, Class B extends A
    Model为范行为,Model<A>与Model<B>没有关系,即不允许Model<A> a = new Model<B>();
  2. 要区别于反省类之间的派生
    如 ModelE<T> extends Model<T>
    允许 Model<T> b = new ModelE<>();
    直接例子就是List和ArrayList
  3. 若存在public <T> void set(Model<A> m){}方法
    Model<A> a = new Model<>();
    Model<B> b = new Model<>();
    set(a);//可行
    set(b);//报错
    这一条引出了泛型中通配符的使用

通配符

泛型类型的继承规则的第3条中的public <T> void set(Model<A> m){}修改为
public <T> void set(Model<? extends A> m){}即可成立

注意:通配符用于方法或变量,而不能用于泛型类上的泛型声明
<? extends Model>限定了上界,意味着能传Model及其子类
<? super Model>限定了下界,意味着能穿Model及父类

因此对<? extends Model>进行getData(),只返回Model类型,因为只知上界;
对<? extends Model>进行setData(),无法传入其子类,因为不知下界;
对<? super Model>进行getData()返回Object,因为最上界已限定;
对<? super Model>进行setData()可传入其子类,因为已知上界。

虚拟机实现泛型

泛型擦除,jdk会用代码中提到过的最接近的类型来直接替代泛型类型,或插入强制转型的代码。
可以通过方法重载的失效来证明这一点

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

推荐阅读更多精彩内容

  • 简介 泛型的意思就是参数化类型,通过使用参数化类型创建的接口、类、方法,可以指定所操作的数据类型。比如:可以使用参...
    零度沸腾_yjz阅读 3,311评论 1 15
  • 泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如ArrayList类可以聚集任何类型...
    Steven1997阅读 715评论 1 0
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 1,986评论 0 3
  • 国足这场比赛悬念起伏不断,从上半场的先被罚一点球,到下半场被狗血的还给对方一个点球,这一切都太不可思议了。这就是一...
    浆糊郎中阅读 233评论 0 0
  • 下了一天的雨后,天气冷了下来。 昨日冒雨急匆匆的为孩子送去了垫被和厚的衣物,怕这冰冷的雨水冻坏了孩子。 今日起床,...
    风儿轻轻阅读 123评论 3 2