Java编程思想——第十五章:泛型

泛型实现了 参数化类型 的概念,使代码可以应用多种类型。

多态算是一种泛化机制。将方法的参数类型设为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数。使用基类能够具备更好的灵活性。但是,考虑到除了 final类 不能拓展,其他任何类都可以被拓展,所以这种灵活性大多数时候也会有一些性能损耗。

方法参数是一个接口也会放松限制。可是有时候,即便使用了接口,对程序的约束还是太强了。因为一旦指明接口,它就要求你的代码必须使用特定的接口。而我们希望达到的目的是编写更通用的代码,要使代码能够应用于某种不具体的类型,而不是一个具体的接口或类。

1.与c++的比较

2.简单泛型

创造容器类 是促成泛型出现的一个重要原因。泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且有编译器来保证类型的正确性。

与其使用Object我们更喜欢暂时不指定类型,而是稍后再决定具体使用什么类型。要达到这个目的,要使用类型参数

public class Holder<T> {
    private T a;
    public Holder(T a) {this.a = a;}
    public void set(T a) {this.a = a;}
    public T get() {return a;}
}
2.1 一个元祖类库
  • 元祖 :它是将一组对象直接打包存储于其中的一个单一对象。这个容器对象允许读取其中元素,但是不允许向其中存放新的对象。元祖也被称为数据传送对象或信使。元祖可以具有任意长度,其中的元素可以是任意不同的类型。还可以利用继承机制实现长度更长的元祖。
  • 为了使用元祖,你只需定义一个长度适合的元祖,将其作为方法的返回值,然后在return语句中创建该元祖,并返回即可。
2.2 一个堆栈类

3.泛型接口

  • 泛型也可以应用于接口。例如 生成器(generator),这是一种专门负责创建对象的类。实际上,这是 工厂方法设计模式 的一种应用。不过,当使用生成器创建新的对象时,它不需要任何参数,而工厂方法一般需要参数。

  • 一般而言,一个生成器只定义一个方法,该方法用以产生新的对象。

    public interface Generator<T> {
        T next();
    }
    

4.泛型方法

泛型方法使得该方法能够独立于类而产生变化。如果使用泛型方法可以取代整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。

4.1 杠杆利用类型参数推断
4.2 可变参数与泛型方法
  • 泛型方法与可变参数列表能够很好地共存
4.3 用于Generator的泛型方法
public class Generators {
    public static <T> Collection<T> fill(Collection<T> coll, Generator<T> gen, int n) {
        for(int i = 0; i < n; i ++)
            coll.add(gen.next());
        return coll;
    }
}
4.4 一个通用的Generator
public class BasicGenerator<T> implements Generator<T> {
    private Class<T> type;
    public BasicGenerator(Class<T> type) {
        this.type = type;
    }
    public T next() {
        try {
            return type.newInstance();
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static <T> Generator<T> create(Class<T> type) {
        return new BasicGenerator<T>(type);
    }
}

5.匿名内部类

  • 泛型还可以应用于内部类以及匿名内部类。

6.构建复杂模型

  • 泛型的一个重要好处是能够简单而安全地创建复杂的模型。

7.擦除的神秘之处

  • 根据JDK文档的描述,Class.getTypeParameters() 将返回一个 TypeVarible 对象数组,表示有泛型声明的类型参数...这只是表示用作参数占位符的标识符,这并非有用的信息。所以

    在泛型代码内部所声明的类型参数,无法获得任何有关泛型参数类型的信息

    因此,你可以知道诸如类型参数标识符和泛型类型边界这类的信息——你却无法知道用来创建某个特定实例的实际的类型参数。

    Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。因此,List<String>List<Integer> 在运行时实际上是相同的类型。这两种类型都被擦除成它们的原生类型,即 List

  • 泛型类型只有在静态类型检查期间才出现。在此之后,程序中的所有泛型类型都被擦除,替换为他们的非泛型上界。普通类型被擦除成 Object

    擦除的核心动机是它使得泛化的客户端可以用非泛化的类库来使用,反之亦然,这经常被称为 迁移兼容性

  • 擦除的代价是显著的。翻寻个不能用于显式地引用运行时类型的操作之中,例如转型、instanceof操作和 new表达式。因为所有关于参数的类型信息都丢失了。

8.擦除的补偿

  • 擦除丢失了在泛型代码中执行某些操作的能力。任何在运行需要周到确切类型信息的操作都将无法工作。

    public class Erased<T> {
        private final int SIZE = 100;
        public static void f(Object arg) {
            if(arg instanceof T) {              //ERROR
                T var = new T();                //ERROR
                T[] array = new T[SIZE];        //ERROR
                T[] array = (T)new Object[SIZE]; //unchecked warning
            }
        }
    }
    

    使用 instanceof 的尝试是失败的,因为其类型信息已经被擦除了。如果引入类型标签,就可以转用动态的 isInstance()



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

推荐阅读更多精彩内容