Java 泛型全解析

 更新时间:2020年08月27日 14:21:12   作者:Jason  
这篇文章主要介绍了Java 泛型的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

泛型简介

什么是泛型?

  • 参化类型,数是JDK1.5的新特性。(定义泛型时使用参数可以简单理解为形参),例如List<E>,Map<K,V>
  • 编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如List<String>在运行时String会被擦除,最终系统会认为都是Object.

为什么要使用泛型?

泛型是进行类型设计或方法定义时的一种约束规范,基于此规范可以:

  1. 提高编程时灵活性(有点抽象,后续结合实例理解)。
  2. 提高程序运行时的性能。(在编译阶段解决一些运行时需要关注的问题,例如强转)

说明:泛型应用相对比较简单,难点在泛型类或方法的设计上,通过这样的设计如何对现有类进行减法设计,提高类或方法的通用性.

泛型应用类型

泛型定义时常用方式有三种(可参考List<E>,Map<K,V)等接口定义):

  1. 泛型类:class 类名<泛型,…>{}
  2. 泛型接口:interface 接口名<泛型,…>{}
  3. 泛型方法: <泛型> 方法返回值类型 方法名(形参){}

泛型类定义及应用

类泛型定义:(用于约束类中方法参数和方法返回值类型)

class Array<T>{//类泛型:类名<泛型>
  Object[] array=new Object[10];
  public void add(T t){}//通过类泛型约束方法参数类型
  public T get(int i){//通过类泛型约束方法返回值类型
    return (T)array[i];
  }
}

泛型接口定义及应用

定义接口时指定泛型,用于约束接口方法参数类型以及方法返回值类

interface Task<Param,Result>{//思考map中的泛型Map<K,V>
  /**
   * 此方法用于执行任务
   * @param arg 其类型由泛型参数Param决定
   * @return 其类型由泛型参数result决定
   */
  Result execute(Param arg);
}

泛型接口应用实践

class ConvertTask implements Task<String,Integer>{
  @Override
  public Integer execute(String arg) {
    // TODO Auto-generated method stub
    return Integer.parseInt(arg);
  }
}

泛型定义及应用

泛型方法中的泛型仅仅应用于当前方法,主要应用于一些静态方法,当然非静态方法也可以应用。

class ObjectFactory{
  /**泛型方法*/
  public static <T>T newInstance(Class<T> cls){
    return (T)cls.newInstance();
  }
}

泛型应用通配符应用

无界限定通配符

泛型无界通配符使用”?”进行表示,可以代表一种任意参数类型(实参类型)。一般应用于变量的定义。例如:Class<?> c1;

Class<?> c=Class.forName("java.util.Date");

上届界限定通配符

泛型上届限定符通过“<? extends 类型>”方式进行实现,主要用于方法参数或方法的返回值类型,例如:

static void doPrint(List<? extends CharSequence> list){
    System.out.println(list);
}

下届限定通配符

泛型下届限定符通过“<? super 类型>”方式进行实现,主要用于方法参数或方法的返回值类型,例如:

static void doPrint(Set<? super Integer> set){
    System.out.println(list);
}

泛型类型擦除实践分析

泛型是编译时的一种类型,在运行时无效,运行时候都会变成Object类型,例如:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
//list.add(100);//直接不可以
//通过反射将100添加到集合
list.getClass().getMethod("add", Object.class).invoke(list, 100);
System.out.println(list);

总结(Summary)

本小节对泛型的定义,应用场景,应用类型以及泛型的类型擦出进行了分析和实践,希望在后续项目实践中对泛型有一个更好的认识。

以上就是Java 泛型全解析的详细内容,更多关于Java 泛型的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot中的@ApiModelProperty注解作用

    SpringBoot中的@ApiModelProperty注解作用

    这篇文章主要介绍了SpringBoot中的@ApiModelProperty注解作用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Spring框架读取property属性文件常用5种方法

    Spring框架读取property属性文件常用5种方法

    这篇文章主要介绍了Spring框架读取property属性文件常用5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 解析Java 泛型什么情况下不能使用

    解析Java 泛型什么情况下不能使用

    这篇文章主要介绍了解析Java 泛型什么情况下不能使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • springboot使用注解获取yml配置的两种方法

    springboot使用注解获取yml配置的两种方法

    本文主要介绍了springboot使用注解获取yml配置的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能

    基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能

    这篇文章主要介绍了基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能,需要的朋友可以参考下
    2021-11-11
  • MyBatis 详细讲解动态 SQL的使用

    MyBatis 详细讲解动态 SQL的使用

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦
    2022-04-04
  • 快速掌握SpringBoot应用的启动入口

    快速掌握SpringBoot应用的启动入口

    本篇并不是深究内置服务器的启动过程,而是追溯Springboot启动之前到底做了什么?它是如何与我们经常写的@SpringBootApplication注解注释的main方法类绑定起来的?对SpringBoot启动入口相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • Java三目运算中隐藏的自动拆装箱

    Java三目运算中隐藏的自动拆装箱

    这篇文章主要介绍了Java三目运算中隐藏的自动拆装箱,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • 基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式为ZIP模式)

    基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式为ZIP模式)

    Maven是一个插件执行框架,所有工作都由插件完成,同时 Maven 基于构建生命周期的核心概念,明确定义了构建和分发特定工件(项目)的过程,接下来通过本文给大家介绍下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式为ZIP模式),需要的朋友可以参考下
    2022-09-09
  • 解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题

    这篇文章主要介绍了解决Mybatis-plus自定义TypeHandler查询映射结果一直为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论