zoukankan      html  css  js  c++  java
  • java学习--基础知识阶段性总结--泛型

    泛型:jdk1.5版本以后出现的一个安全机制。表现格式:< >

    好处:

    1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。

    2:避免了强制转换的麻烦。

    只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给<>中传递一个具体的引用数据类型。

    泛型技术:其实应用在编译时期,是给编译器使用的技术,到了运行时期,泛型就不存在了。

    为什么? 因为泛型的擦除:也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。

    在运行时,如何知道获取的元素类型而不用强转呢?

    泛型的补偿:因为存储的时候,类型已经确定了是同一个类型的元素,所以在运行时,只要获取到该元素的类型,在内部进行一次转换即可,所以使用者不用再做转换动作了。

    什么时候用泛型类呢?

    当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。

    ----------------------------------------------------------

    泛型在程序定义上的体现:

    //泛型类:将泛型定义在类上。

    class Tool<Q> {

    private Q obj;

    public  void setObject(Q obj) {

    this.obj = obj;

    }

    public Q getObject() {

    return obj;

    }

    }

    //当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上。

    public <W> void method(W w) {

    System.out.println("method:"+w);

    }

    //静态方法上的泛型:静态方法无法访问类上定义的泛型。如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。

    public static <Q> void function(Q t) {

    System.out.println("function:"+t);

    }

    //泛型接口.

    interface Inter<T> {

    void show(T t);

    }

    class InterImpl<R> implements Inter<R> {

    public void show(R r) {

    System.out.println("show:"+r);

    }

    }

    ------------------------------------------------------------

    泛型中的通配符:可以解决当具体类型不确定的时候,这个通配符就是 ?  ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型。

    泛型限定:

    上限:?extends E:可以接收E类型或者E的子类型对象。

    下限:?super E:可以接收E类型或者E的父类型对象。

    上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。

    下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。

    泛型的细节:

    1)、泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型;

    2)、使用带泛型的类创建对象时,等式两边指定的泛型必须一致;

    原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了;

    3)、等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);

    ArrayList<String> al = new ArrayList<Object>();  //错

    //要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。

    ArrayList<? extends Object> al = new ArrayList<String>();

    al.add("aa");  //错

    //因为集合具体对象中既可存储String,也可以存储Object的其他子类,所以添加具体的类型对象不合适,类型检查会出现安全问题。 ?extends Object 代表Object的子类型不确定,怎么能添加具体类型的对象呢?

    public static void method(ArrayList<? extends Object> al) {

    al.add("abc");  //错

    //只能对al集合中的元素调用Object类中的方法,具体子类型的方法都不能用,因为子类型不确定。

    }

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/bigorangehasc/p/8646087.html
Copyright © 2011-2022 走看看