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

    泛型 Generic


    泛型机制(generic mechanism)

    1.what:

    如果除去对象的基本数据类型外,实现方法是相同的,那么我们就可以用泛型实现(generic implementation)来描述这种基本功能。

    2.why:为什么要有泛型(Generic)?

    [外链图片转存失败(img-t5uyUyWC-1565349373722)(为什么需要泛型.png)]

    1. 解决元素存储的安全性问题:编译时检测类型,提高代码的安全性
    2. 解决数据元素获取时,需要类型强转的问题:减少了类型转换的次数,提高了效率
    3. 提高代码的复用性

    泛型,JDK1.5新加入,解决数据类型的安全性问题,其主要原理是:

    • 在类声明时通过一个标识,表示类中某个属性的类型或者是某个方法的返回值及参数类型。
    • 这样在类声明或实例化时,只要指定好需要的具体的类型即可。

    Java泛型可以保证:

    • 如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。
    • 在编译时而不是在运行时检测错误。
    • 同时,代码更加简洁、健壮。

    3.how:

    泛型擦除:编译时将泛型转换为对应类型

    泛型的使用语法

    List<String> list = new ArrayList<>();//jdk7出现的新特性
    List<String> list = new ArrayList<String>();
    List<String> list = new ArrayList();//为了提高版本的兼容性,支持该写法,但不建议
    List list = new ArrayList<String>();//为了提高版本的兼容性,支持该写法,但不建议
    View Code

    泛型的自定义

    1.自定义泛型类

    class Mygen<T,U,K...>{
        1.成员属性:T weight;
        2.成员方法:方法中泛型可以应用到参数、返回值
        3.构造器:构造器也是可以应用的
        4.泛型数组:可以声明,但不可以在类型未知的情况下初始化
        静态内容:不能使用泛型
    }
    View Code

    如何确定泛型类的泛型?

    • 当该类创建对象时或被继承时

    注意:子类的泛型个数要大于等于父类的泛型个数

    2.自定义泛型接口

    interface MyInter<T,U>{
        //不能应用在属性上:属性为静态常量,先于泛型被确定前使用
        public U method(T t);//可以应用在方法上
    }
    View Code

    如何确定泛型接口的泛型?

    • 当该接口被实现或被继承时

    注意:

    • 不能应用在属性上:接口中所有的属性都是public static final的,而泛型类型是非静态的
    • 实现类的泛型个数要大于等于父接口的泛型个数
    • 实现类如果实现多个接口,那么实现类的泛型个数要大于等于所有接口的泛型个数
    • 如果多个接口中存在相同的方法,泛型参数不能作为重载的参数条件()

    3.自定义泛型方法

    public<A> void fun(A a){
        //方法体
    }

    如何确定泛型方法的泛型?

    • 当该方法被调用传参时

    4.通配符

    作用在形参上:

    • <?> :可以接收任意类型的泛型
    • <? extends XX>:支持XX类型或XX的子类,规定了泛型的上限
    • <? super XX>:支持XX类型或XX的父类,规定了泛型的下限

    例如:

    • <? extends Animal> 可以接受Animal类型以及其所有子类类型
    • <? super Dog> 可以接收Dog类型以及其以上所有级别类型

    转自https://blog.csdn.net/select_alter_drop/article/details/98980154

  • 相关阅读:
    [Bash] Shortcut
    [Bash] Rerun Bash Commands with History Expansions (!! & !$)
    [Bash] Create and Copy Multiple Files with Brace Expansions in Bash
    [Bash] Add Executable Files to $PATH with Bash
    [Typescript] Create Type From Any Given Data in TypeScript
    [Typescript] Ignore Null or Undefined Values with TypeScript Non-Null Assertion Operator
    [Bash] Chain Commands with Pipes and Redirect Output in Bash
    [Bash] Use Conditional Statements in Bash
    [Bash] Understand Exit Statuses in Bash
    监听内容变化 TextWatcher @功能 [MD]
  • 原文地址:https://www.cnblogs.com/Ke-Me/p/14266182.html
Copyright © 2011-2022 走看看