zoukankan      html  css  js  c++  java
  • Java基础加强-泛型

    /*泛型*/ (泛型是给编译器看的)

    泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,
    编译器编译带类型带类型说明的集合时,会去掉 "类型" 信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样
    由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据
    例如:用反射得到集合,再反射调用该集合的add方法即可

    /*了解泛型*/
    1.参数化类型与原始类型的兼容性
    /*参数化类型和原始类型可以相互引用*/ 如4.
    2.参数化类型不考虑类型参数的继承关系
    /*即Vector<Object> v1 = new Vevtor<String>() 错误的! 反过来也是一样的*/
    3.在创建数组实例时,数组的元素不能使用参数化的类型
    /*Vector<Integer> vectorList[] = new Vector<Integer>[10] 错误的!*/
    4.下面的代码不会报错 /*编译器检查代码是一行一行检查,参数化类型和原始类型可以相互引用*/
    Vector v1 = new Vevtor<String>();
    Vector<Object> = v1;

    注:List<User> users = new ArrayList<User>()
    List<User> users = new ArrayList<>()
    二者有什么区别 ,除了 编辑器 有警告

    /*泛型的通配符及其扩展*/
    Collection<?>a 可以与任意参数化的类型匹配,但到底匹配什么类型,编译阶段是不知道的,所以
    a = new ArrayList<Integer> 和 a = new ArrayList<String>都可以,这就是通配符 "?" 的作用
    另外,由通配符定义的参数化类型,只能调用和类型参数无关的方法,如 /*size()*/ 方法,不能调用如 /*add(E e)*/方法等需要未来才能明确类型的方法

    /*通配符的扩展*/
    限定通配符的上边界 /*通配符匹配的类型参数要为Number 或为Number的子类*/ 最大为Number
    List<? extends Number> list = new ArrayList<Integer>; /**/
    限定通配符的下边界 /*通配符匹配的类型参数要为Integer 或为Integer的父类*/ 最小为Integer
    List<? super Integer> list = new ArrayList<Number>;
    限定通配符总是包括自己

    /*自定义泛型方法及应用*/
    定义泛型方法
    Java中的泛型类型(或者泛型)类似C++中的模板。但是这种相似性仅限于表面,Java语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型判断,然后生成普通的非泛型的字节码(擦除)
    Java的泛型方法没有C++模板函数功能强大,如:
    //add方法最后返回的类型 与 X,Y的类型相关,进行类型推断 (能够包含X类型和Y类型的类型)
    private <T> T add(T x , T y) {
    //return x+y;//提示,不是所有的类型都可以执行 + 操作; 这个在C++中是可以通过的
    return null;
    }

    另外,1.泛型方法的类型参数,只能是引用类型,不能是基本类型,如:T 不能被 int 等替换
    2.定义泛型的时候也可以使用extends限定符
    3.也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throw列表中,但不能用于catch,即只能扔,不能抓

    /*如果类型有多个方法需要使用泛型,则应该使用类级别的泛型*/

    /*通过反射获得泛型的实际类型参数*/(即List<Date>),得到Date

    1.反射得到某个方法
    Method test3 = Test3.class.getMethod("test4", List.class);
    2.得到泛型的类型参数
    Type[] gpts = test3.getGenericParameterTypes();
    3.用ParameterizedType 表示参数化类型
    ParameterizedType pType = (ParameterizedType) gpts[0];
    4.pType.getRawType() //得到声明此类型的类或接口。 List
    pType.getActualTypeArguments()[0] //得到实际类型参数的 Type 对象的数组 Date 只所以是数组,是因为可能有多个

  • 相关阅读:
    Java NIO中的缓冲区Buffer(二)创建/复制缓冲区
    Java NIO中的缓冲区Buffer(一)缓冲区基础
    Java中的反射
    Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例
    Spring Data JPA例子[基于Spring Boot、Mysql]
    Spring Session
    Spring Data Redis示例
    Spring IO Platform简介及示例
    使用Spring Boot开发 “Hello World” Web应用
    2017/01/13,今天正好是开通博客园一周年,谈谈自己的一些想法
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7354662.html
Copyright © 2011-2022 走看看