美文网首页程序员
论持久战之Java泛型(类、接口、方法)及通配符

论持久战之Java泛型(类、接口、方法)及通配符

作者: 怪咖_OOP | 来源:发表于2017-04-10 00:32 被阅读0次

    什么是泛型?

    泛型,即“参数化类型”。例如:定义方法时有形参,然后调用此方法时传递实参。参数化类型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

    使用泛型有什么好处?(官方介绍)

    1.类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

    2.消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

    3.潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

    泛型的使用有哪些规则和限制?

    1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
    2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
    3、泛型的类型参数可以有多个。
    4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
    5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);

    泛型使用场景:

    底层框架API封装,方法的形参以及返回值参数。


    Paste_Image.png Paste_Image.png

    泛型类和接口

    以List为例:

    Paste_Image.png

    假设我们有三个类Animal、Dog、Cat,它们 的关系Dog extends Animal、Cat extends Animal

    Paste_Image.png

    对比结论:
    1与2比较:当泛型类或接口指定类型,类型实参只能是指定类或其子类
    1与3比较:当泛型类或接口不指定具体类型时,类型实参为Object。

    泛型方法

    语法:泛型声明必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前;可以声明多个泛型,用逗号隔开。

    Paste_Image.png

    通配符(上界、下界、无界)

    上界

    Paste_Image.png
    简介:

    上界通配符中的上界,指的是泛型内的类型,最高是Animal类,最低不限,只要是继承了Animal类,都可以通过编译,这也就是为什么叫 "上界",最高类型就是Animal类。

    分析:

    因为“? extends Animal”可代表Animal或其子类,上面的操作应该是可行的。事实上是”不行“,即无法通过编译。为什么呢?
    在List<Aimal> list里只能添加Animal类对象及其子类对象(如Dog和Cat对象),在List<Dog>里只能添加Dog类和其子类对象,不能添加Animal对象(不是Dog的子类)。

    这里的List<? extends Animal>数据类型不定,如果传入的是List<Animal>,这三个add操作是OK的,但是传入的是List<Dog>或List<Cat>会引发类型不兼容问题;Java为了保护其类型的一致性,不能往list添加任意对象的,不过却可以添加null

    下界

    14917534799002.jpg
    简介:

    下界通配符中的下界,指的是泛型内的类型,最低是Animal类,最高到超类Object,只要是Animal的父类,都可以通过编译,这也就是为什么叫 "下界",因为最低是Animal类。

    分析 :

    既然最低是Animal类,为什么animals.add(dog)和animals.add(cat)不报错呢?
    Java多态,任何一个子类都可向上转型到父类。

    无界

    14917544546587.jpg
    简介

    “?”可以代表任意类型,也就是未知类型

    通配符使用总结

    上界通配符<? extends T> 指的是,引用内的泛型范围,最高是T类,最低不限
    可以取元素
    不能添加元素
    下界通配符<? super T> 指的是,引用内的泛型范围,最低是T类,最高是超类Object
    可以取元素,但是取出的元素是Object
    可以添加元素,添加的元素,必须是T类或者其子类

    相关文章

      网友评论

        本文标题:论持久战之Java泛型(类、接口、方法)及通配符

        本文链接:https://www.haomeiwen.com/subject/gvkjattx.html